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

33

我正在使用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任务。

对此有任何意见、建议、评论、注意事项或批评吗?


还有一些关于异步处理的信息,请参阅queue-deferred-execution-in-cakephp/ - mark
4个回答

25
我已经使用BeanstalkD和用PHP编写的后端取回工作并对其进行操作,效果非常好。我将实际的作业运行包装在一个bash脚本中,即使退出也能保持运行(除非我执行'exit(UNIQNUM);',当脚本检查到它时,它将真正退出)。通过这种方式,重新启动的PHP脚本清除了可能已被使用的任何内存,并且每运行25/50/100个作业就可以重新开始。

使用它的几个优点之一是可以将优先级和延迟设置为BeanstalkD作业 - “以较低的优先级运行此任务,但不要在10秒钟内开始”。 我还排队了许多作业(现在运行此作业,在5秒钟后再运行一次,在30秒后再运行一次)。

使用适当的网络配置(并在可访问整个网络的IP地址上运行它),您还可以在一个服务器上运行beanstalkd守护程序,并从其他多台机器轮询它,因此,如果正在生成大量任务,则可以将工作分拆在服务器之间。如果某个特定的任务集需要在特定的机器上运行,我创建了一个“管道”,即该机器的主机名,它应该在我们的群集中是唯一的,如果不是全局的(用于文件上传很有用)。 我发现它非常适合图像调整大小,通常会在网页引用它之前将完成的较小图像返回到文件系统,以便引用它的URL。

我实际上即将开始为我的博客编写有关这个主题的一系列文章(包括我已经通过了数百万次实时请求的代码技术) - 我的URL链接在我在Stackoverflow的用户资料中。

(我已经编写了一篇有关Beanstalkd和作业排队的一系列文章


1
谢谢,这很有帮助。我目前也在使用Beanstalkd。到目前为止,我已经创建了一个简单的CakePHP模型行为,称为“deferred”,它只是对模型的延迟方法调用。延迟行为将调用放入beanstald中,后台运行的Cake Shell从beanstalkd获取消息并执行调用。到目前为止,我唯一担心的是Beanstalkd不是持久性的。您有遇到过这样的问题吗?如果beanstalkd死了,您的某些图像没有被调整大小怎么办? - Sander Marechal
它从未让我失望过,即使我往里面放了10万个字符串。而且,如果图像没有被调整大小,它仍然在上传目录中,可以稍后处理。 - Alister Bulman
仅供参考,我认为您提供的Beanstalkd网站已经更改,似乎与任何类型的PHP编程项目都不相关。 - Rick
@rick - 哎呀 - 它实际上不是一个有效的URL。已修复。 - Alister Bulman

4
如果您使用像beanstalkd这样的消息队列,您可以启动尽可能多的进程(甚至在同一台服务器上)。每个工作进程将从队列中获取一个作业并处理它。如果需要更多容量,您可以添加更多的工作进程和服务器。
使用单线程工作进程的好处是您不必处理进程内同步问题。作业队列会确保不会处理两次相同的作业。

0
Gearman怎么样?在PHP中有很好的支持和集成,具有并行任务、扩展性、监控等功能...

0

也许值得考虑使用Amazon SQS与EC2一起使用?


4
不,谢谢。我希望自给自足,除了一个带机架和大容量网络的ISP外,不依赖于外部服务。 - Sander Marechal
我了解SQS也可能存在一些显著的延迟。如果您正在转码视频或音频,则不是问题,但如果您正在获取人们登录时的信息,则更为重要。 - Alister Bulman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接