2016-11-29 1 views
0

Существует общепринятый способ запуска фонового процесса на PHP с использованием функциональных возможностей exec или shell_exec.Запуск фонового сценария из вызова php exec/shell_exec теперь не работает и повторно появляется, пока он не работал

У меня был успех с этим в прошлом с периодической отправкой электронной почты и отправкой данных в API в фоновом режиме.

В PHP страницы, которую вы назвали бы по Ajax, вы делаете что-то вроде этого:

echo 'process running'; 
shell_exec('/usr/bin/php -q path_to_background_script.php > /dev/null &'); 
exit; 

Фоновый процесс обычно выполняется как при вызове владельцем пользователя PHP как терминального процесса.

Недавно, однако, в системе FASTCGI (ea-php56) я обнаружил, что этот метод перестает работать.

Вместо одного процесса, начинающегося с одного веб-запроса на вызывающую страницу, я получаю фоновый скрипт, который постоянно заканчивается и повторно создается с новым идентификатором процесса. Интересно, что единственный способ остановить этот непрерывный повторный набор - отключить строку в вызывающем скрипте, который запускает этот процесс. Повторное восстановление немедленно прекращается, когда вы сохраняете вызывающий файл без вызова фонового сценария. Это говорит мне, что это фактически вызывающий скрипт (запрошенный браузером), который на самом деле повторно создается.

Это то, что выглядит рестайлинг с корневого терминала. Обратите внимание, что PID изменяется каждый раз я смотрю:

[[email protected]*** public_html]# ps -ef | grep php 
*user* 725  1 7 23:53 ?  00:00:00 /opt/cpanel/ea-php56/root/usr/bin/php-cgi /home/*user*/public_html/background-script_exec.php 
root  727 32411 0 23:53 pts/1 00:00:00 grep php 
[[email protected] public_html]# ps -ef | grep php 
*user* 757  1 5 23:53 ?  00:00:00 /opt/cpanel/ea-php56/root/usr/bin/php-cgi /home/*user*/public_html/background-script_exec.php 
root  759 32411 0 23:53 pts/1 00:00:00 grep php 
[[email protected] public_html]# ps -ef | grep php 
*user* 781  1 12 23:54 ?  00:00:00 /opt/cpanel/ea-php56/root/usr/bin/php-cgi /home/*user*/public_html/background-script_exec.php 

Я попытался отключить "PHP-FPM сервис для CPanel Демонов". Я попробовал «ignore_user_abort()». Функция fastcgi_finish_request() недоступна, поэтому не удалось попробовать. Я попытался создать сценарий оболочки вместо этого, чтобы вызвать фоновый PHP-скрипт, который я вызываю из вызывающего скрипта, но это также делает то же самое.

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

Проблема кажется сходным с таковым здесь: php exec/shell_exec/system/popen/proc_open runs calling script itself infinite number of times on linux

, но предложение сообщили здесь не поможет в этом случае.

ответ

0

Это, кажется, решает проблему. Использование «php5-кли» вместо «PHP»

shell_exec('/usr/bin/php5-cli path_to_background_script.php > /dev/null &'); 

Я был в начале перепробовал PHP-кли »и нашел, что это не было - я не думаю, чтобы проверить, что он был назван по-другому!

Если имеющие аналогичные проблемы, загляните для PHP бинарных файлов:

>>ls /usr/bin/php* 
>>/usr/bin/php /usr/bin/php5 /usr/bin/php5-cli /usr/bin/php-config /usr/bin/phpize 

использовать тот, который для командной строки, и она должна затем работать должным образом.

-отметить, что эта проблема была конкретно связана с системой fastcgi-php easy-apache linux cpanel, работающей на Centos.

Смежные вопросы