【问题标题】:Asynchronous processing or message queues in PHP (CakePHP) [closed]PHP(CakePHP)中的异步处理或消息队列[关闭]
【发布时间】:2015-09-12 21:48:25
【问题描述】:

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

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

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

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

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

对此有任何意见、建议、cmets、陷阱或火焰吗?

【问题讨论】:

标签: php multithreading cakephp asynchronous message-queue


【解决方案1】:

我使用BeanstalkD 和一个用PHP 编写的后端来检索作业然后对它们采取行动取得了很好的效果。我将实际运行的作业包装在一个 bash 脚本中,即使它退出也能继续运行(除非我执行“exit(UNIQNUM);”,当脚本检查它并实际退出时)。这样,重新启动的 PHP 脚本会清除所有可能已使用的内存,并且可以每运行 25/50/100 个作业重新启动。

使用它的几个优点是您可以在 BeanstalkD 作业中设置优先级和延迟 - “以较低的优先级运行它,但不要在 10 秒内开始”。有时我也将一些作业排队(现在运行,5 秒后运行,30 秒后再次运行)。

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

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

(我写了一个series of articles,主题是 Beanstalkd 和工作队列)

【讨论】:

  • 谢谢,这很有帮助。我现在也在和 Beanstalkd 一起工作。到目前为止,我已经创建了一个简单的 CakePHP 模型行为,称为“延迟”,它只是模型上的延迟方法调用。延迟行为将调用置于 beanstald 中,并且在后台运行的 Cake Shell 执行从 beanstalkd 获取消息并执行调用。到目前为止,我唯一担心的是 Beanstalkd 不是持久的。你有什么问题吗?如果 beanstalkd 死了,而你们中的一些图像永远不会调整大小怎么办?
  • 它从未在我身上死去,即使我在其中放入了 100,000 个字符串。另外,如果图片没有调整大小,它仍然在上传目录中,可以稍后再做。
  • 仅供参考,我认为您链接到的 Beanstalkd 站点已更改,因为它似乎与任何类型的 php 编程项目都不相关
  • @rick - 哎呀 - 它实际上不是一个有效的 URL。固定。
【解决方案2】:

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

使用单线程工作线程的好处是您不必处理进程内部的同步。作业队列将确保没有作业被处理两次。

【讨论】:

    【解决方案3】:

    与 EC2 结合使用的 Amazon SQS 是否值得一试?

    【讨论】:

    • 不用了,谢谢。我希望自力更生。除了带有机架和粗大管道的 ISP 之外,不依赖外部服务。
    • 我知道 SQS 也会有一些明显的延迟。如果您正在对视频或声音进行转码,这不是问题,如果您在人们登录时获取信息则更是如此。
    【解决方案4】:

    Gearman 呢?对 php 的良好支持和集成以及并行任务、缩放、监控等功能......

    【讨论】:

      猜你喜欢
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 2015-12-16
      • 1970-01-01
      • 2011-01-23
      • 2013-09-10
      • 1970-01-01
      • 2013-04-12
      相关资源
      最近更新 更多