【问题标题】:Parallel script execution from PHP and waiting从 PHP 执行并行脚本并等待
【发布时间】:2016-09-13 06:59:10
【问题描述】:

我必须从 PHP 启动许多脚本并尽可能快地完成它们。不过,这些脚本是用不同的语言编写的。我以某种方式启动了它们,但我不知道如何等待它们。我的代码:

foreach ($commands as $command) {
    exec($command.' &');
}

PHP 脚本停止执行,但后台仍有大量工作。如何在 PHP 中等待这些任务?

类似问题:
Parallel processing in PHP - How do you do it? – 等待/同步被忽略
Executing multiple PHP scripts in parallel, and being notified when finished – 仅限于 PHP 脚本

【问题讨论】:

  • 您是否控制这些脚本并可以添加其他功能?如果需要等待,为什么还要执行后台进程?
  • @Justinas 我只控制 PHP。我有很多脚本要执行,很多内核要使用,而且时间不够。
  • @h2ooooooo 我不执行并行 PHP 脚本。我只从 PHP 开始。
  • @Michas 它们可能仅适用于 PHP 脚本(因为在使用 nohup 或任何其他并行命令运行它们时,您可以得到通知的唯一方法是以特殊方式返回的程序)但是你可以简单地制作一个 PHP 脚本启动器,这样它就可以运行MainPHP -> many PHPScriptLaunchers -> exec()。这样你就可以解决仅在 PHP 中的问题。如果这不可能,请阅读this solution。

标签: php sh


【解决方案1】:

如果要执行的脚本是用不同的语言编写的,最好的方法可能是GNU parallel:

注意文档:

如果给出命令,GNU 并行解决与 xargs 相同的任务。如果没有给出命令 GNU 并行将表现类似于 cat |嘘。

因此,您可以在 PHP 中轻松构建由换行符分隔的任务列表,并将它们提供给parallel,如下所示:

echo $'ls\necho 42\npython3 -c "print(43)"' | parallel 
1
2
3
42
43

在 PHP 中使用 proc_open 将任务列表提供给 parallel 的 stdin 并不难。

然后你只需要等待并行完成,当并行终止时,所有子任务也终止,你可以很容易地配置并行执行多少个任务,如果你有太多,全部执行像您尝试执行的并行操作将比像parallel 通常可以执行的那样以 5 x 5 启动它们要慢。

【讨论】:

    猜你喜欢
    • 2021-03-08
    • 2018-11-28
    • 1970-01-01
    • 2017-10-11
    • 2016-05-23
    • 2021-10-10
    • 2012-09-16
    • 2011-07-22
    • 2022-12-18
    相关资源
    最近更新 更多