0

在 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 上运行调用脚本本身无限次

但是,这里报告的建议在这种情况下没有帮助。

4

1 回答 1

0

这似乎可以解决问题。使用 '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

使用用于命令行的那个,然后它应该可以正常运行。

- 请注意,此问题专门针对在 Centos 上运行的 linux cpanel easy-apache fastcgi-php 系统。

于 2016-11-29T22:54:06.237 回答