在 PHP 中,我想并行运行几个独立的任务。每个任务都会产生一个结果,我想在结果准备好后将其发送回访问者的浏览器。这个想法是使用正常加载页面,然后使用 HTML5 SSE(服务器发送事件)在数据可用时将数据发送到浏览器,同时保持 HTTP 连接以keep-alive
. 我不只是想刷新输出;我将做很多不同的任务,这些任务都是并行运行的完美候选,所以我不想同步执行它们。
我最初的想法是使用pthreads extension进行多线程处理。我不确定线程是如何与 PHP 一起工作的。只要我有一个线程正在运行,与浏览器的连接是否会保持打开状态,即我可以安全地将数据从线程发送回浏览器吗?我认为 pthreads 相当稳定,但我不相信我应该使用它,因为它是实验性的。
pthreads 曾经是,现在也是,结果非常好。它的任何限制或功能可能随时更改;这就是实验的本质。
然后我想起了 Gearman,它允许我使用工人来完成我的任务。后台工作人员是我需要的,因为我不希望我的脚本执行在等待作业完成时阻塞,因为我想并行运行多个作业。这对 Gearman 来说没有问题,但如果我使用后台工作人员,我很不确定能否将结果发送回 Gearman 客户端。据我了解,后台工作人员将在自己的进程或上下文中运行,所以我想这意味着我无法从后台工作人员将数据发送回浏览器?我注意到GearmanClient 类提供了一些设置回调的方法,但据我从研究中了解到,似乎这些回调仅通过同步调用调用。理想情况下,我要么想直接从我的后台工作人员那里发回结果(我怀疑这是可能的),要么让后台工作人员在完成时通知客户端,而无需调查 Gearman 的工作状态。回调处理程序将是最佳选择,因为我可以从那里发回数据。
我还考虑将 ActiveMQ 之类的消息传递系统(或 memcached)与ZendQueue一起使用。这个想法是在一个通道上发送工作请求,然后在不同的通道上监听结果。当从结果通道读取消息时,消息会直接发送到浏览器。缺点是我会做额外的工作,例如将结果消息映射到请求。
最后,我非常倾向于 Gearman 方法,但我只是不确定是否有可能实现我想要的。总而言之,我想执行每个需要几秒钟的并行任务,并在结果准备好时将它们单独发送回浏览器(通过使用 HTML5 SSE)。
我的方法可行吗?你还有其他建议吗?提前非常感谢!