在 PHP 中,有一种常用的方法是使用 exec 或 shell_exec 功能启动后台进程。
过去,我通过批量发送电子邮件和在后台向 API 发送数据,在这方面取得了成功。
在您将通过 ajax 调用的 PHP 页面中,您可以执行以下操作:
echo 'process running';
shell_exec('/usr/bin/php -q path_to_background_script.php > /dev/null &' );
exit;
后台进程通常像终端进程一样由 php 用户的所有者调用。
然而,最近,在 FASTCGI 系统(ea-php56)下,我发现这种方法已经停止工作。
我不是从一个 Web 请求开始到调用页面的一个进程,而是让后台脚本不断终止并使用新的进程 ID 重新生成。有趣的是,停止这种持续重生的唯一方法是禁用启动进程的调用脚本中的行。当您保存调用文件而不调用后台脚本时,重新生成会立即停止。这告诉我,实际上是重新生成的调用脚本(由浏览器请求)。
这就是从根终端重新生成的样子。请注意,每次查看时 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
我尝试禁用“cPanel 守护程序的 PHP-FPM 服务”。我试过'ignore_user_abort()'。fastcgi_finish_request() 函数不可用,因此无法尝试。我尝试创建一个 shell 脚本来调用后台 PHP 脚本,我从调用脚本中调用该脚本 - 但这也做同样的事情。
除了禁用从 PHP 网页触发后台脚本的能力之外,这种新的 PHP FastCGI 行为正在创建一个不稳定的重新生成过程,如果没有上述干预,它不会停止。它使 shell_exec / exec 功能不稳定!
问题似乎与此处报告的类似: php exec/shell_exec/system/popen/proc_open 在 linux 上运行调用脚本本身无限次
但是,这里报告的建议在这种情况下没有帮助。