【问题标题】:Trying to call a PHP CLI script from a web script causes Apache to spawn multiple child processes尝试从 Web 脚本调用 PHP CLI 脚本会导致 Apache 产生多个子进程
【发布时间】: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 -qphp 之后保留用于将下一部分用作args,因此php -q test.php foo bar 将在$argsv 中的php 中具有array('test.php','foo','bar')

标签: php apache command-line-interface


【解决方案1】:

测试一下:

名为 xyz.php 的 php 文件

<?php
shell_exec('php -r "sleep(20);" >> /dev/null 2>&1 &');

然后在命令行下运行

php xyz.php

如果你从浏览器调用它,它的行为是相同的。

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

【讨论】:

    猜你喜欢
    • 2011-06-20
    • 2012-07-31
    • 2021-01-29
    • 2011-05-11
    • 2013-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-31
    相关资源
    最近更新 更多