【发布时间】:2017-08-25 20:50:48
【问题描述】:
阅读了大量关于从 Web 脚本调用长时间运行的 PHP CLI 脚本以及守护 CLI 脚本的最佳方法的线程后,我在 Apache 处理 CLI 脚本的方式上遇到了一个无法解决的问题。 根据this blog post,最好的选择是这样做:
print `echo /usr/bin/php -q longThing.php | at now`;
当我在我的本地 CentOS 7/PHP 7/Apache 2.4.6 VM 上执行此操作时,它的工作原理就像一个魅力,但是,我的生产服务器 Centos 6.8/PHP 7/Apache 2.4.25 (cPanel) 上的相同代码导致 Apache 产生 100 多个子进程,迅速耗尽 CPU 和内存资源,需要重新启动才能修复。即使我迅速杀死 PHP CLI 进程,Apache 也已经陷入某种循环。我的理解是,通过使用上面建议的代码,您将 Apache 与 CLI 进程分离,但显然不是。 谁能指出我出了什么问题?如果需要,我可以发布我的生产服务器的实际代码和更多详细信息。 谢谢
【问题讨论】:
-
请注意:为什么在这里使用
-q,你没有添加任何参数? -
我会这样做
php longThing.php >> /path/to/log/log.log 2>&1 &将作业推送到后台并将所有内容记录到日志文件中 -
按照博客文章的建议使用 -q 将 Web 脚本与调用它的 apache 进程分离。目的是守护 cli 脚本,以便 apache (a) 不会将其作为子进程生成,并且 (b) cli 脚本将在 apache 重新启动后继续存在。
-
你链接的博文是 7 年的,是错误的。如果出于某种原因您需要在后台执行某些操作。你会使用某种工作服务器——当然,这并不总是可能的。因此,最好的方法是让您的 Apache 通过 FastCGI 与 PHP“对话”,而不是通过
mod_php。然后你可以使用一个很棒的函数fastcgi_finish_request();,它可以让你将输出发送到网络服务器,然后在后台继续你的长期任务。 -
@Grindlay
-q在php之后保留用于将下一部分用作args,因此php -q test.php foo bar将在$argsv中的php 中具有array('test.php','foo','bar')。
标签: php apache command-line-interface