代码之家  ›  专栏  ›  技术社区  ›  Sander Marechal

php(cakephp)中的异步处理或消息队列[关闭]

  •  33
  • Sander Marechal  · 技术社区  · 15 年前

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

    我遇到了 MultiTask plugin 对于看起来很有前途的Cakephp。我还遇到了各种消息队列实现,例如 dropr beanstalkd . 当然,我还需要某种背景过程,可能是使用某种蛋糕壳实现的。我看到多任务使用 PHP_Fork 实现多线程PHP守护进程。

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

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

    我目前的计划是要么使用多任务插件,要么编辑它使用Beanstald,而不是它自己的mysql表实现。队列中的作业可以简单地由任务名和参数数组组成。php守护进程将监视传入的作业,并将它们传递给它的一个子线程。只需使用给定的参数执行cakephp任务。

    对此有什么意见、建议、评论、疑问或争议吗?

    4 回复  |  直到 9 年前
        1
  •  25
  •   Community tir38    7 年前

    我的成绩很好 BeanstalkD 以及一个用PHP编写的后端,用于检索作业,然后对其进行操作。我将实际运行的作业包装在一个bash脚本中,以在它退出时继续运行(除非我执行a' exit(UNIQNUM); ,当脚本检查它并实际退出时)。这样,重新启动的PHP脚本将清除所有可能使用过的内存,并可以每运行25/50/100个作业重新启动一次。

    使用它的一个优点是,您可以将优先级和延迟设置为beanstack作业-“以较低的优先级运行此作业,但不要在10秒内启动”。我也曾在某个时间将一些作业排队(现在运行,5秒后运行,30秒后再次运行)。

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

    实际上,我正准备为我的博客写一系列关于这个主题的文章(包括一些我已经推过数百万条实时请求的代码技术),我的URL链接到 user profile 这里,在stackoverflow上。

    (我写了一篇文章) series of articles 关于beanstrack和工作队列的主题)

        2
  •  4
  •   Peter Stuifzand    15 年前

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

    使用单线程工作程序的好处在于不必处理进程内部的同步。JobQueue将确保不会两次处理任何作业。

        3
  •  0
  •   neilcrookes    15 年前

    可能也值得一看 Amazon SQS 与EC2一起使用?

        4
  •  0
  •   gdm    9 年前

    Gearman呢?在PHP中有很好的支持和集成,以及并行任务、缩放、监视等功能…