我正在CakePHP中构建一个网站,它处理通过XML和web前端上传的文件。文件需要由ClamAV扫描,缩略图需要生成等等。所有资源密集型的工作,需要一些时间,用户不应该等待。因此,我正在研究PHP的异步处理,特别是CakePHP。
我偶然发现MultiTask插件 for CakePHP看上去很有希望。我还遇到了各种消息队列实现,如落差和贝斯塔尔德。当然,我还需要一些背景过程,可能是使用某种类型的Cake实现的。我看到MultiTask使用分叉来实现多线程PHP守护进程。
我需要一些关于如何以最好的方式将所有这些部件组合在一起的建议。
我目前的计划是要么使用MultiTask插件,要么编辑它来使用beanstald,而不是它自己的MySQL表实现。队列中的作业可以简单地由任务名称和参数数组组成。PHP守护进程将监视传入的作业,并将它们传递给其子线程之一。将使用给定的参数简单地执行CakePHP任务。
对此有什么意见、建议、评论,有什么疑问吗?
发布于 2009-06-02 16:22:23
我在BeanstalkD和一个用PHP编写的后端中都取得了很好的效果,可以检索作业,然后对它们进行操作。我包装了实际的作业--运行在bash-脚本中,以便即使它退出也能继续运行(除非我执行了“exit(UNIQNUM);”,当脚本检查它并实际退出时)。这样,重新启动的PHP脚本清除了可能使用过的任何内存,并且可以每运行25/50/100作业重新启动一次。
使用它的优点之一是可以将优先级和延迟设置到BeanstalkD作业中--“以较低的优先级运行它,但不要启动10秒”。我还在某个时候排队等待了许多作业(现在运行,在5秒内运行,30秒后再运行)。
有了适当的网络配置(并在可访问的IP地址上运行到网络的其他部分),您还可以在一台服务器上运行beanstalkd deamon,并将其从多台其他计算机上轮询,因此,如果生成大量任务,则可以在服务器之间分离工作。如果需要在特定的机器上运行一组特定的任务,我已经创建了一个“管道”,它是机器的主机名,如果不是全局的,那么它在集群中应该是唯一的(对于文件上传很有用)。我发现它对图像大小调整非常有效,通常在网页本身引用它之前将完成的较小的图像返回到文件系统,然后引用它将要到达的URL。
实际上,我即将开始为我的博客撰写一系列关于这个主题的文章(包括一些我已经通过数百万个实时请求完成的代码技术)--我的用户配置文件链接在这里,在Stackoverflow上。
(我写了一个关于Beanstalkd和排队工作的系列文章 )
发布于 2009-05-26 10:29:03
如果您使用像beanstalkd这样的消息队列,您可以启动任意数量的进程(甚至在同一台服务器上)。每个工作进程将从队列中获取一个作业并处理它。如果需要更多的容量,可以添加更多的工作人员和更多的服务器。
使用单个线程工作人员的好处是不必处理进程内部的同步问题。作业队列将确保不会处理两次作业。
发布于 2009-05-26 19:48:50
是否也值得检查与Amazon一起使用的EC2?
https://stackoverflow.com/questions/909791
复制相似问题