从 PHP 应用程序运行并行 CLI 进程的最有效方法 [关闭]

Posted

技术标签:

【中文标题】从 PHP 应用程序运行并行 CLI 进程的最有效方法 [关闭]【英文标题】:The most effective way to run parallel CLI processes from PHP application [closed] 【发布时间】:2021-03-31 14:46:10 【问题描述】:

我正在尝试从 php 代码中找到运行多个 ImageMagick CLI 进程的最佳方法。

我将 ImageMagick 用作 CLI 实用程序,因为我必须进行复杂而密集的图像处理。这比使用 Imagick 扩展编写大量相应的 PHP 代码更方便。

任务是获取一个包含许多 (50-100) 帧的巨大 GIF 文件,并尽可能快地处理所有这些帧。所以,如果我们有一个有 16 个 CPU 核心的服务器,我们需要同时处理 16 个帧。

我看到的解决方案:

    最简单的:使用 PHP exec 函数执行所有处理,并在命令末尾添加一个 & 符号,例如
exec('convert frame1.gif ...some_params... frame1_output.gif &');
exec('convert frame2.gif ...some_params... frame2_output.gif &');
exec('convert frame3.gif ...some_params... frame3_output.gif &');
...

之后,我们只需要在输出目录中等待所需数量的输出文件即可。 这种方法会正确利用 CPU 内核吗?

    使用某种事件驱动的异步处理 PHP 框架,例如Amp。它在内部使用libevlibevent我不确定使用事件循环启动 CLI 进程是否是个好主意。

    使用Parallel

    与生产者和许多消费者(工人)一起使用某种任务队列。每个工作人员将是一个单独的 PHP 进程。这种方法会导致消息代理或某种其他类型的队列实现、部署、处理时的网络延迟等开销......

    使用一些流程管理器,例如PHP-PM 或 Supervisor 仅用于生成 ImageMagick 进程。

哪种方法似乎最适合您? 还有什么其他方法可以解决这个问题?

【问题讨论】:

恕我直言,为每一帧创建一个读取 GIF 文件并对其进行处理并将其写回磁盘的整个过程似乎不太可能是最佳途径 - 尽管它取决于GIF 的大小和处理的复杂性。您可能还必须在最后重新组装 GIF 并重新优化调色板? @MarkSetchell 是的,我最终将不得不从处理结果中重新组装一个新的 GIF 文件。但我想这与并行处理问题无关。作为流程的替代品,您有什么建议?谢谢你的回答。 【参考方案1】:

对于这样的任务...如果您不必使用 PHP,我会在这里使用 NodeJS。简单的异步任务会为您做到这一点

【讨论】:

“异步”和“并行”不相等。 NodeJS 是异步但单线程的,我的问题是关于并行进程(以及启动它们的正确方法)。

以上是关于从 PHP 应用程序运行并行 CLI 进程的最有效方法 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如果能够并行执行很少的进程,那么能够有效地生成许多进程有什么意义呢?

在 BDB 中并行查找多个文件的值

PHP多进程初步

进程(并发,并行)

PHP实现多进程并行操作,可做守护进程(转,备用)

PHP多进程处理并行处理任务实例