【问题标题】:PHP async process communicationPHP异步进程通信
【发布时间】:2012-02-01 10:54:40
【问题描述】:

有没有办法在 PHP 中实现进程间(或线程)通信,但仍保持一切异步运行?

我想要一个创建 4 个进程然后立即终止的脚本。 4 个进程中的每一个都应该执行一个操作,完成后它应该通知某人(可能是另一个脚本?)它完成了。所以我想知道所有 4 个脚本什么时候完成,这样我就可以将我的状态从 retrieving 更新为 done

这可能吗?最好不要重新编译 PHP(我读到这是使用线程所必需的),但如果有必要我会这样做。

【问题讨论】:

  • 为什么创建进程的脚本必须立即终止?
  • Preferably without re-compiling PHP (I read this is required for working with threads) - 真的吗?在哪里? AFAIK 不可能对 PHP 进行多线程处理,如果你找到了一种我非常想知道的方法...
  • @MichaelMior:因为我不希望用户必须等到 4 个子脚本完成,因为它们需要很多时间。 @DaveRandom:不,不支持原生多线程,但blog.motane.lu/2009/01/02/multithreading-in-php 展示了如何模拟它们,但需要重新编译 PHP 才能使 pcntl_fork 工作。
  • 然后您可以简单地使用ignore_user_abort() 并将输出刷新到浏览器以允许脚本在后台继续运行。
  • 看看这个 [post][1] 它对我有用 [1]:stackoverflow.com/a/13690590/599993

标签: php multithreading interprocess inter-process-communicat


【解决方案1】:

Gearman 可能会提供您正在寻找的内容。

【讨论】:

    【解决方案2】:

    您可以使用作业排队系统或将其粘贴到 CRON 中。 PHP 支持一些作业队列,但我过去使用过Gearman,我写了一个custom wrapper around the Linux at command。这两者都可以用来实现“类似线程”的​​行为,而无需重新编译 PHP。

    【讨论】:

      【解决方案3】:

      正如其他人所提到的,Gearman 是一种解决方案。另一个,我更喜欢的,是创建一个异步消息队列,您可以在其中在作业堆栈上添加作业。

      我将ZeroMQ 用于此类目的,并且有一个可用的PHP 框架为称为Photon 的异步任务实现ZeroMQ。浏览 Photon 的源代码可能会给你一些关于如何实现异步作业队列的想法,以防你决定使用它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-18
        • 2011-06-22
        • 1970-01-01
        • 1970-01-01
        • 2017-05-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多