Запущенный фоновый скрипт из вызова 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 меняется каждый раз, когда я смотрю:

[root@*** 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
[root@dev 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
[root@dev 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 запускает вызывающий скрипт бесконечное число раз в linux

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

1 ответ

Кажется, это решает проблему. Использование "php5-cli" вместо "php"

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

Я рано попробовал 'php-cli' и обнаружил, что он не существует - я не думал проверять, чтобы увидеть, что он был назван по-другому!

Если у вас возникли похожие проблемы, посмотрите бинарные файлы php:

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

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

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

Другие вопросы по тегам