【问题标题】:Running PHP exec() asynchronously/multi-processes异步/多进程运行 PHP exec()
【发布时间】:2011-03-21 07:57:31
【问题描述】:

我目前正在 PHP 脚本中运行这些行:

foreach ($list as $route)
{
    exec('php-cgi ./nextbus-route_stop_predictions.php route=' . $route['route_id']);
}

nextbus-route_stop_predictions.php 运行大约需要 15 秒,而 exec() 运行大约 12 次。我想知道 PHP 是否能够运行这些命令行而无需等待前一个 exec() 的输出。所以基本上,我想运行这个异步/多进程。

更新

对于仍在寻找答案的人,我使用了 nohup 并将输出通过管道传输到 /dev/null

【问题讨论】:

    标签: php


    【解决方案1】:

    如果您使用 *nix,pcntl_fork() 可能会提供帮助。

    pcntl_fork() 函数创建一个子进程,它与父进程的区别仅在于它的 PID 和 PPID。请参阅您系统的 fork(2) 手册页以了解有关 fork 如何在您的系统上工作的具体细节。

    【讨论】:

    • 我已经用过很多次了,必须说如果你的工作是高度并行的(意味着你不需要进程间通信或同步),它工作得很好。我用它一次解析大约 500 个 XML 文件(每个大约 1gb)。我只是为每个进程分叉一个子进程(好吧,使用进程池)并让它运行它退出的单元......
    • 不完全确定这是如何运行的,但我是否只是在我的 for 循环中使用了 $pid = pcntl_fork()?
    【解决方案2】:

    如果您将 php 作为 Apache 模块运行,则可以执行此处提到的技巧

    http://joseph.randomnetworks.com/archives/2005/10/21/fake-fork-in-php/

    exec("php-cgi ./nextbus-route_stop_predictions.php route=" . $route['route_id'] . " 2>/dev/null >&- < &- >/dev/null &");
    

    基本上重新路由stderr、stdout并将进程发送到后台。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-26
      • 1970-01-01
      • 2010-09-18
      • 2015-05-27
      • 2013-08-19
      • 2021-09-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多