PHP 中的异步处理或消息队列 (CakePHP) [已关闭]

我正在CakePHP中构建一个网站,处理通过XML-RPC API和Web前端上传的文件。文件需要由ClamAV扫描,需要生成缩略图等。所有需要一些时间的资源密集型工作,用户不必等待。因此,我正在研究一般的PHP和CakePHP的异步处理。

我遇到了CakePHP的MultiTask插件,看起来很有前途。我还遇到了各种消息队列实现,例如droprbeanstalkd。当然,我还需要某种后台流程,可能是使用某种 Cake Shell 实现的。我看到 MultiTask 使用 PHP_Fork 来实现多线程 PHP 守护程序。

我需要一些关于如何以最佳方式将所有这些部分组合在一起的建议。

  • 用PHP编写一个长时间运行的守护进程是一个好主意吗?我应该注意什么?
  • 外部消息队列实现的优势是什么?多任务插件不使用外部消息队列。它使用MySQL表来存储任务。
  • 我应该使用什么消息队列?滴水?豆茎?别的?
  • 我应该如何实现后端处理器?分叉PHP守护进程是一个好主意还是只是自找麻烦?

我目前的计划是要么使用MultiTask插件,要么将其编辑为使用beanstald而不是它自己的MySQL表实现。队列中的作业可以简单地由任务名称和参数数组组成。PHP 守护程序将监视传入的作业,并将它们传递给它的子线程之一。将简单地使用给定的参数执行 CakePHP 任务。

对此有任何意见,建议,评论,陷阱或火焰吗?


答案 1

我在BeanstalkD和用PHP编写的后端中取得了出色的结果,可以检索作业,然后对它们采取行动。我将实际运行的作业包装在bash脚本中,即使它退出(除非我执行“”,否则当脚本检查它并实际退出时)也能继续运行。这样,重新启动的 PHP 脚本将清除可能已使用的任何内存,并且可以每运行 25/50/100 个作业重新开始一次。exit(UNIQNUM);

使用它的几个优点是,您可以将优先级和延迟设置为BeanstalkD作业 - “以较低的优先级运行它,但不要启动10秒”。我还在某个时候将许多作业排入队列(现在运行它,在5秒内,在30秒后再次运行)。

使用适当的网络配置(并在网络其余部分的可访问IP地址上运行它),您还可以在一台服务器上运行beanstalkd deamon,并从许多其他机器轮询它,因此如果生成了大量任务,则可以在服务器之间拆分工作。如果需要在特定计算机上运行一组特定的任务,我已经创建了一个“tube”,它是该计算机的主机名,在我们的集群中应该是唯一的,如果不是全局的(对于文件上传很有用)。我发现它非常适合图像大小调整,通常将完成的较小图像返回到文件系统,然后再引用它的网页本身将引用它将到达的URL。

实际上,我即将开始为我的博客撰写有关此主题的一系列文章(包括我已经推送了数百万个实时请求的一些代码技术) - 我的URL是从我的用户配置文件链接到Stackoverflow上的。

(我写了一系列关于豆茎和工作排队的文章)


答案 2

如果您使用像beanstalkd这样的消息队列,则可以根据需要启动任意数量的进程(即使在同一台服务器上)。每个工作进程将从队列中获取一个作业并进行处理。如果需要更多容量,可以添加更多工作线程和更多服务器。

使用单线程工作线程的好处是,您不必在进程内处理同步。作业队列将确保不会处理任何作业两次。


推荐