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

时间:2009-05-26 09:27:37

标签: php multithreading cakephp asynchronous message-queue

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

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

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

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

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

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

4 个答案:

答案 0 :(得分:25)

我使用BeanstalkD获得了出色的结果,并用PHP编写后端来检索作业,然后对其进行操作。我将实际的作业运行在一个bash脚本中以便继续运行,即使它已经退出(除非我执行'exit(UNIQNUM);',当脚本检查它并且实际将退出时)。这样,重新启动的PHP脚本会清除可能已经使用的所有内存,并且可以重新启动它运行的每个25/50/100个作业。

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

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

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

(我写了一篇关于Beanstalkd主题的user profile和排队的工作)

答案 1 :(得分:4)

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

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

答案 2 :(得分:0)

也值得查看Amazon SQS以与EC2一起使用?

答案 3 :(得分:0)

Gearman怎么样? PHP中的良好支持和集成以及并行任务,扩展,监控等功能......