PHP CLI процесс не завершается после завершения - PullRequest
4 голосов
/ 25 июля 2011

У меня есть это в одном файле PHP:

echo shell_exec('nohup /usr/bin/php -f '.CRON_DIRECTORY.'testjob.php > /dev/null 2>&1 &');

и в testjob.php у меня есть:

file_put_contents('test.txt',time()); exit;

И все это работает просто денди.Однако, если я перехожу к процессам, он не завершает testjob.php после запуска.

Ответы [ 3 ]

1 голос
/ 25 июля 2011

(необходимость оставлять это как ответ вместо комментария как stackoverflow все же не позволит мне оставлять комментарии ...)

У меня работает. Я сделал testjob.php точно так же, как описано, и другой файл test.php только с указанной строкой (за исключением того, что я удалил CRON_DIRECTORY, потому что testjob.php был в том же каталоге для меня).

Чтобы быть уверенным, что я измерял правильно, я добавил «sleep (5)» вверху testjob.php, а в другом окне у меня есть:

watch 'ps a |grep php'

бег. Это происходит:

  1. Я запускаю test.php
  2. test.php завершается немедленно, но testjob.php появляется в моем списке
  3. Через 5 секунд он исчезает.

Мне стало интересно, может ли shell иметь значение, поэтому я переключился с bash на sh. Тот же результат.

Мне также было интересно, может ли это быть из-за того, что ваш внешний скрипт работает долго. Поэтому я поставил «sleep (10)» внизу test.php. Тот же результат (т.е. testjob.php завершается через 5 секунд, test.php завершается через 5 секунд).

Так что, бесполезно, ваша проблема не в том коде, который вы опубликовали.

0 голосов
/ 25 июля 2011

Удалите & из конца вашей команды. Этот символ говорит nohup продолжить работу в фоновом режиме, поэтому shell_exec ожидает завершения задачи ... и ждет ... и ждет ... до конца времен;)

Я даже не понимаю, зачем вам выполнять эту команду с nohup.

echo shell_exec('/usr/bin/php -f '.CRON_DIRECTORY.'testjob.php > /dev/null 2>&1');

должно быть достаточно.

0 голосов
/ 25 июля 2011

Вы выполняете PHP и делаете это выполнение фоновой задачей. Это означает, что он будет работать в фоновом режиме , пока не будет завершен. shell_exec не убьет этот процесс или что-то подобное.

Возможно, вы захотите установить предел выполнения, В PHP cli по умолчанию установлено значение . См. Также set_time_limit Руководство по PHP ;

Так что, если вам интересно, почему процесс php не завершается, вам необходимо отладить скрипт. Если это слишком сложно и вы не можете выяснить, почему скрипт выполняется так долго, вы можете просто захотеть прервать процесс через некоторое время, например, 1 минута.

...