当前位置: 首页 > 知识库问答 >
问题:

从php exec/shell_exec调用运行后台脚本现在失败了,并在以前工作的地方重新生成

终翔
2023-03-14

在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

我尝试禁用"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个答案

穆乐逸
2023-03-14

这似乎解决了问题。使用“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系统上特别出现的。

 类似资料:
  • 我试图通过Docker运行一个目录监视器的单元测试,它对文件和目录的创建、移动和重命名做出反应。 以下是脚本: > 是监视器注意到的事件存放的地方 是目录监视器 只是一个bash脚本,用于创建、重命名和移动一些文件和目录。 只是一个Python单元测试脚本(在这里运行是为了调试) 问题是,有些测试在构建时没有任何明显的原因就失败了,但是如果我从运行的容器中尝试完全相同的bash指令,它就会按预期工

  • 但得到以下错误: 如何使其工作? 谢谢您的帮助。 顺便说一句:我正在使用JRE1.8.0_65

  • 我从以下链接实现了re运行失败的TestNG测试类的逻辑: 不幸的是,它使用“test”注释运行该方法,而不运行BeforeClass(@BeforeClass)和AfterClass(@AfterClass)方法。我试图研究ITestAnnotations的setDependsOnMethods和getDependsOnMethods方法,但没有成功。 有人知道如何让侦听器类同时运行Before

  • 问题内容: 我有一个脚本,每5分钟检查一次PC上的内容,并且我不希望Python显示在任务栏上。我使用Windows作为操作系统。 有什么方法可以让Python在后台运行并强制其不在我的任务栏中显示? 问题答案: 在控制面板中查找计划任务。

  • 我正在尝试使用空手道执行bash脚本。我可以从karate-config.js和.feature文件中执行脚本。我还可以将参数传递给脚本。问题是,如果脚本失败(以0以外的其他东西退出),测试执行将继续并以SuccesFull结束。 我发现当脚本回显时,我可以作为脚本的结果访问它,这样我就可以回显退出值并对其进行断言(在一些可重用的特性中),但这似乎是一个变通方法,而不是一个有效的干净解决方案。有没

  • 问题内容: 使用chromedriver让Win Jenkins奴隶还可以吗? 我的测试从Maven存储库中提取chromedriver和便携式chrome,然后执行它们。在本地以及当构建用户在构建系统上执行相同操作时,工作正常。 当jenkins做同样的事情时,即使在前台运行(不是svc),它也会失败,并显示以下错误。我尝试传递参数以提高详细程度无济于事。 org.openqa.selenium