PHP中的异步处理或消息队列(CakePHP)

San*_*hal 33 php multithreading asynchronous cakephp message-queue

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

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

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

  • 有一个用PHP编写的长期运行守护进程是一个好主意吗?我应该注意什么?
  • 外部消息队列实现的优点是什么?MultiTask插件不使用外部消息队列.它使用MySQL表来存储任务.
  • 我应该使用什么消息队列?dropr?beanstalkd?别的什么?
  • 我该如何实现后端处理器?分离PHP守护进程是一个好主意还是只是在寻找麻烦?

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

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

Ali*_*man 25

我用BeanstalkD和一个用PHP编写的后端来检索作业然后对它们采取行动,我得到了很好的结果.我将实际的作业运行在一个bash脚本中以便继续运行,即使它已经退出(除非我执行' exit(UNIQNUM);',当脚本检查它并且实际将退出时).通过这种方式,重新启动的PHP脚本清除下来,可能已被使用,并且可以开始运行重新每25/50/100工作的内存.

使用它的一些优点是您可以将优先级和延迟设置为BeanstalkD作业 - "以较低的优先级运行,但不要启动10秒".我也在一段时间内将一些工作排​​队等候(现在运行,5秒钟后再运行30秒).

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

我实际上即将开始为我的博客撰写一系列关于这个主题的文章(包括我已经通过几百万个实时请求的代码的一些技术) - 我的URL链接来自我的用户配置文件,在Stackoverflow上.

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