Запущенный фоновый скрипт из вызова 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.