PHP passthru () блоки с заменой процесса - PullRequest
0 голосов
/ 05 марта 2012

У меня проблема с блокировкой PHP passthru(), когда предполагается запустить демон.

У меня есть демон Node.js с оболочкой bash-скрипта. Этот bash-скрипт использует небольшую замену процесса, потому что сервер Node.js не может напрямую войти в syslog. Скрипт bash содержит следующую команду:

forever -l app.log app.js

Но поскольку я хочу, чтобы он регистрировался в системном журнале, я использую:

forever -l >(logger) app.js

При замене процесса logger был создан дескриптор файла, подобный /dev/fd/63, путь которого передается команде forever в качестве файла журнала для использования.

Это прекрасно работает, когда я запускаю демон, используя скрипт bash напрямую, но когда скрипт bash выполняется с использованием PHP passthru () или exec (), эти вызовы будут блокироваться. Если вместо замены процесса я использую обычный файл журнала, то и passthru (), и exec () работают нормально, запуская демон в фоновом режиме.

Я создал полный рабочий пример (используя простой демон PHP вместо Node.js) в Gistub Gist: https://gist.github.com/1977896 (требуется PHP 5.3.6 +)

Почему passthru() вызывает блокировку при замене процесса? И могу ли я что-нибудь сделать, чтобы обойти это?

1 Ответ

0 голосов
/ 25 марта 2012

passthru () будет блокироваться в PHP, даже если вы запустите демон, это неудачно.Я слышал, что некоторым людям повезло, что они переписывают его с помощью nohup:

exec('/path/to/cmd');

, затем становится:

exec('nohup /path/to/cmd &');

Лично мне больше всего повезло с exec () 'использование exe wget для вызова другого скрипта (или того же скрипта) для фактического запуска exec блокировки.Это освобождает вызывающий процесс от блокировки, передав его другому http-процессу, не связанному с действующим пользователем.С соответствующими флагами wget вернется немедленно, не дожидаясь ответа:

exec('wget --quiet --tries=1 -O - --timeout=1 --no-cache http://localhost/path/to/cmd');

Обработчик http в конечном итоге истечет, что нормально, и демон должен работать.Если вам нужен вывод (отсюда и вызываемый вами вызов passthru ()), просто запустите скрипт, перенаправляющий вывод в файл, а затем опрашивайте этот файл на предмет изменений в вашем реальном процессе.

...