php - 将 exec 用于长时间运行的脚本

标签 php ubuntu process cron exec

我想从 API 中获取一些数据并将该用户保存在数据库中,此操作根据时间需要随机时间,有时甚至需要 4 小时,
我正在使用 exec 执行脚本和 &在php的后台,

我的问题是 exec 对于长时间运行的作业是安全的,我对 fork 和 linux 进程等了解不多,所以我不知道 CPU 内核内部发生了什么,

这是我发现让我感到困惑的事情,

http://symcbean.blogspot.com/2010/02/php-and-long-running-processes.html

有人可以告诉我我是否与 exec 朝着正确的方向前进吗?

脚本完成后进程会自行终止吗?

谢谢

最佳答案

好吧,那篇文章正在讨论进程“树”以及子进程如何依赖于它产生父进程。
PHP 实例启动一个子进程(通过 exec 或类似方法)。如果它不等待进程输出,则 PHP 脚本结束(例如,响应被发送到浏览器),但进程将处于空闲状态,等待它的子进程完成。
这样做的问题是,在 apache 决定终止其父进程(因为您有太多空闲进程)并有效地终止其子进程之前,不能保证子进程(长时间运行的 4 小时进程)完成其工作。
文章的作者随后给出了使用守护进程并将子进程与父进程分开的建议。
编辑:
回答你在评论中留下的问题,这里是他在文章中使用的命令的快速解释

echo /usr/bin/php -q longThing.php | at now
从左到右开始。
  • echo 将您放在它前面的内容打印到标准输出 (STDOUT),所以...
  • echo /usr/bin/php -q longThing.php将打印到 shell /usr/bin/php -q longThing.php
  • | (管道)将前一个命令的 STDOUT 直接馈送到下一个命令的标准输入 (STDIN)。
  • 从 STDIN 读取命令并在指定时间执行它们。 at now表示该命令将立即执行。

  • 所以基本上这与在 shell 中运行以下序列是一样的:
  • at now - 打开 at 提示
  • /usr/bin/php -q longThing.php - 我们要运行的命令
  • ^D (通过按 Control+D)- 保存作业

  • 所以,关于你的问题:

    Will the child process be immediately killed after the PARENT PHP script ends?


    不。

    Will the child process be killed at all, in some future moment?


    是的。 Apache 会为您解决这些问题。

    Will the child process finish its job before being killed?


    也许。也许不吧。 Apache 可能会在它完成之前杀死它。发生这种情况的几率随着空​​闲进程的数量和进程完成所需的时间而增加。

    边注:
    我认为这篇文章确实指出了正确的方向,但我不喜欢直接从 PHP 生成进程的想法。事实上,PHP 没有合适的工具来运行(长时间和/或密集)bg 工作。仅使用 PHP,您几乎无法控制它。
    但是,我可以为您提供我们为不久前遇到的类似问题找到的解决方案。我们创建了一个小程序,它可以接受数据处理请求并对其进行排队(大约 5 分钟),并在请求完成时进行报告。这样我们就可以控制同时运行的进程数、内存使用量、同一用户的请求数等......
    该程序实际上托管在另一台 LAN 服务器中,这可以防止内存使用高峰减慢网络服务器的速度。
    在前端,当请求完成时,会通过长轮询通知用户,

    关于php - 将 exec 用于长时间运行的脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26822947/

    相关文章:

    php - 导出到 ExCel 显示某些列为空

    php - 为 Symfony 1.4 设置第一个 schema.yml

    php - 如何使用按钮选择列表的最新或下一个元素

    linux - 无法让 PostgreSQL 9.4 监听端口 5432

    linux - 是否可以从 bash 脚本中设置超时?

    c - 先执行父进程再执行子进程,反之亦然

    php - Laravel 和 LocalStack 的最大执行时间

    c++ - LEDA-6.3 库

    gcc - Ubuntu:为 STM32 (Cortex-M3) 交叉编译时使用什么 gcc?

    在后台运行的 Linux 守护进程