popen и poclose под zend-сервером

Я наткнулся на феномен, который сам не могу объяснить.

Я использую popen для выполнения php, а затем таким образом запускаю php-скрипт и pclose, чтобы закрыть его. Пока все нормально. Я столкнулся с довольно серьезными проблемами, так как скрипт, в котором я это использовал, не выполнялся, и вместо этого после трех попыток подряд я разбил zend-сервер (ни одна страница больше не открывалась). Я узнал, что причиной этого было то, что я использовал неправильный каталог для php.exe. Пример:

if (pclose(popen("C:\wrongDir\php\php.exe C:\Zend\Apache2\htdocs\myApp\public\mytest.php 57 > C:\Logs\1\0\jobOut.log 2> C:\Logs\1\0\jobErr.log"))>-1)
{
.....
}

Помимо «wrongDir», все остальные каталоги были правильными.... popen даже создал файлы jobOut и jobErr (которые были пустыми). (примечание: PHP не находится в пути поиска, поэтому он не был найден без правильного пути)

Хоть я сейчас и решил проблему....У меня вопрос, это нормальное поведение там, или я что-то не так сделал (может даже настройки сервера). Как с чего Я читал в руководстве по обеим командам, мне показалось, что в моем случае у меня должно было быть возвращаемое значение либо -1, либо 0, а не проблема, с которой я столкнулся с процессом, а затем с зависанием сервера).

Спасибо.


person Thomas    schedule 05.12.2012    source источник


Ответы (1)


Похоже, что pclose() возвращает не статус выхода процесса, а возможность закрыть процесс.

Чтобы получить «код» завершения процесса, используйте pcntl_wifexited() и pcntl_wexitstatus().

http://php.net/manual/en/function.pclose.php
http://php.net/manual/en/function.pcntl-wexitstatus.php

person ethrbunny    schedule 10.12.2012
comment
Интересно, хотя один вопрос останется. Почему он там падает (таким образом, дочерний процесс зависает. Хотя, если я ввожу ту же команду в командную строку, она заканчивается ошибкой, и я снова выхожу в приглашение командной строки.... там нет зависания. Итак, эта часть моего вопроса было бы, если бы это было нормальным поведением там или если это возможная ошибка конфигурации, поскольку, когда я запускаю команду errornous через php, дочерний процесс остается активным на неопределенный срок) Таким образом, поскольку процесс все еще работает, он не должен был генерировать там код выхода. - person Thomas; 11.12.2012
comment
Интересно, вызывает ли вложение popen/pclose проблемы. Он все еще падает, если вы разделите это на несколько строк? - person ethrbunny; 11.12.2012
comment
Поэтому я не смог протестировать его на сервере zend (в настоящее время он недоступен), но я смог немного протестировать его на xampp. Проблема не вызвана непосредственно popen/pclose! Как кажется, это больше вызвано самим веб-сервером. Когда вызывается несуществующий exe, на сервере открывается окно с сообщением об ошибке (созданное самим веб-сервером .... таким образом, на сервере zend я его не видел, но теперь на моей локальной машине с локальным веб-сервером). И это удерживало процесс открытым, чтобы он не закрывался. Что касается pcntl_wifexited(), я прав, что мне нужно будет повторить, чтобы я использовал pcntl_fork для нескольких процедур? - person Thomas; 13.12.2012
comment
Кажется разумным. Всплывающее окно — это странно. - person ethrbunny; 13.12.2012
comment
Меня это удивило, так как обычно это должно попадать в журналы ошибок apache, а не во всплывающее окно (по крайней мере, я ожидал этого) - person Thomas; 16.12.2012
comment
Так это были окна? Может он не работает как служба? - person ethrbunny; 16.12.2012
comment
Xampp, который я использовал на своем локальном компьютере, не работает как служба, но zend-сервер на сервере работает как служба. - person Thomas; 17.12.2012
comment
Возможно, вы увидели всплывающее окно вместо сообщения журнала. - person ethrbunny; 17.12.2012
comment
Возможно, хотя явление было таким же на zend-сервере (хотя я не могу сказать, было ли там также всплывающее окно или не только явление о незавершении было таким же, о котором я знаю). - person Thomas; 18.12.2012