尝试从web脚本调用PHP CLI脚本会导致Apache生成多个子进程

尝试从web脚本调用PHP CLI脚本会导致Apache生成多个子进程,php,apache,command-line-interface,Php,Apache,Command Line Interface,阅读了大量关于从web脚本调用长时间运行的PHP CLI脚本的线程,以及对CLI脚本进行后台监控的最佳方法,我发现Apache处理CLI脚本的方式遇到了一个无法解决的问题。 根据,最好的选择是执行以下操作: print `echo /usr/bin/php -q longThing.php | at now`; 当我在本地CentOS 7/PHP 7/Apache 2.4.6虚拟机上执行此操作时,它就像一个魔咒,然而,我的生产服务器CentOS 6.8/PHP 7/Apache 2.4.25(

阅读了大量关于从web脚本调用长时间运行的PHP CLI脚本的线程,以及对CLI脚本进行后台监控的最佳方法,我发现Apache处理CLI脚本的方式遇到了一个无法解决的问题。 根据,最好的选择是执行以下操作:

print `echo /usr/bin/php -q longThing.php | at now`;
当我在本地CentOS 7/PHP 7/Apache 2.4.6虚拟机上执行此操作时,它就像一个魔咒,然而,我的生产服务器CentOS 6.8/PHP 7/Apache 2.4.25(cPanel)上的相同代码会导致Apache产生100个子进程,迅速耗尽CPU和内存资源,需要重新启动才能修复。即使我很快终止了PHPCLI进程,Apache也已经陷入了某种循环。我的理解是,通过使用上面建议的代码,您将Apache与CLI进程分离,但显然不是这样。 有人能告诉我哪里出了问题吗?如果需要,我可以发布实际代码和生产服务器的更多详细信息。 谢谢

测试一下:

名为xyz.php的php文件

<?php
shell_exec('php -r "sleep(20);" >> /dev/null 2>&1 &');
如果你从浏览器中调用它,这是同样的行为


xyz.php
将完成,不会等待20秒。

请注意:为什么要在这里使用
-q
,您没有添加任何参数吗?我会这样做
php longThing.php>/path/to/log/log.log 2>&1&
,它将作业推到后台,并将所有内容都记录到日志文件中使用-q,正如blog post建议的那样,将web脚本与调用它的apache进程断开连接。其目的是对cli脚本进行后台监控,以便apache(a)不会将其作为子进程生成,并且(b)cli脚本将在apache重新启动后继续运行。您链接的日志(已有7年历史)是错误的。如果出于任何原因,你需要在后台做点什么。你会使用某种作业服务器——当然,这并不总是可能的。因此,最好的方法是让您的Apache通过FastCGI与PHP“对话”,而不是通过
mod_PHP
。然后您可以使用一个名为
fastcgi_finish_request()的强大函数
允许您将输出发送到web服务器,然后在后台继续执行您的长任务。@Grindlay
-q
php
之后作为参数保留以供下一部分使用,因此
php-q test.php foo bar
将在php中包含
$argsv
数组('test.php','foo','bar')
php xyz.php