1

在 PHP 中,我想并行运行几个独立的任务。每个任务都会产生一个结果,我想在结果准备好后将其发送回访问者的浏览器。这个想法是使用正常加载页面,然后使用 HTML5 SSE(服务器发送事件)在数据可用时将数据发送到浏览器,同时保持 HTTP 连接以keep-alive. 我不只是想刷新输出;我将做很多不同的任务,这些任务都是并行运行的完美候选,所以我不想同步执行它们。

我最初的想法是使用pthreads extension进行多线程处理。我不确定线程​​是如何与 PHP 一起工作的。只要我有一个线程正在运行,与浏览器的连接是否会保持打开状态,即我可以安全地将数据从线程发送回浏览器吗?我认为 pthreads 相当稳定,但我不相信我应该使用它,因为它是实验性的。

pthreads 曾经是,现在也是,结果非常好。它的任何限制或功能可能随时更改;这就是实验的本质。

然后我想起了 Gearman,它允许我使用工人来完成我的任务。后台工作人员是我需要的,因为我不希望我的脚本执行在等待作业完成时阻塞,因为我想并行运行多个作业。这对 Gearman 来说没有问题,但如果我使用后台工作人员,我很不确定能否将结果发送回 Gearman 客户端。据我了解,后台工作人员将在自己的进程或上下文中运行,所以我想这意味着我无法从后台工作人员将数据发送回浏览器?我注意到GearmanClient 类提供了一些设置回调的方法,但据我从研究中了解到,似乎这些回调仅通过同步调用调用。理想情况下,我要么想直接从我的后台工作人员那里发回结果(我怀疑这是可能的),要么让后台工作人员在完成时通知客户端,而无需调查 Gearman 的工作状态。回调处理程序将是最佳选择,因为我可以从那里发回数据。

我还考虑将 ActiveMQ 之类的消息传递系统(或 memcached)与ZendQueue一起使用。这个想法是在一个通道上发送工作请求,然后在不同的通道上监听结果。当从结果通道读取消息时,消息会直接发送到浏览器。缺点是我会做额外的工作,例如将结果消息映射到请求。

最后,我非常倾向于 Gearman 方法,但我只是不确定是否有可能实现我想要的。总而言之,我想执行每个需要几秒钟的并行任务,并在结果准备好时将它们单独发送回浏览器(通过使用 HTML5 SSE)。

我的方法可行吗?你还有其他建议吗?提前非常感谢!

4

1 回答 1

1

我只能回答 pthreads 部分。

到目前为止,不支持持久线程,因此在每个请求结束时,所有创建的上下文都被销毁(加入)。将数据直接从线程发送到浏览器可能是个坏主意(在某些设置中会导致崩溃),原因是 Zend 级别无法控制 apache 或您正在使用的任何 sapi 的输出,所以 pthreads 不努力连接 stdout 或任何那个......这个想法应该是让接受连接的线程(或进程)使用来自它创建的线程的数据来处理到客户端的输出......

持久化线程有点问题,PHP 并不真正支持持久化对象,mysqli 等提供持久化对象的方式与 pthreads 对持久化线程所需的方式不同,首先,它们的接口始终相同(即,它实现了 mysqli),其中 pthreads 由用户在 PHP 中实现。即使我要解决这个问题,我也可以想象它们很容易被误解,我对持久线程的实验仍在继续,如果或当我找到合适的实现时,文档将被更新。

于 2013-05-03T17:20:23.413 回答