【问题标题】:What are some good distributed queue managers in php?php中有哪些好的分布式队列管理器?
【发布时间】:2010-10-14 03:40:28
【问题描述】:

我正在处理一个图像处理网站,而不是让冗长的工作阻止用户浏览器,我希望所有命令都能快速返回一个工作 ID,并让后台任务完成实际工作。然后可以使用 id 来检查状态和结果(即处理图像的 url)。我找到了很多用于 ruby​​、java 和 python 的分布式队列管理器,但我对这些语言的了解还不够多,无法使用它们。

我自己的测试是使用共享 mysql 数据库对作业进行排队,将它们锁定到工作人员,并将它们标记为已完成(将返回数据保存在数据库中)。这只是一个凌乱的原型,整个过程我都觉得自己好像在重新发明轮子(而且不是很优雅)。 php 中是否存在我可以使用的东西(或者我可以用 RESTful 方式与之交谈?)?

阅读更多,我发现我正在寻找的是一个具有 php api 的排队系统,它不必用 php 编写。我只找到了与 Amazon 的 SQS 一起使用的类,但这不仅不是免费的,而且有时还很隐蔽(超过一分钟才能显示一条消息)。

【问题讨论】:

    标签: php queue distributed


    【解决方案1】:

    Zend_Framework 有一个队列类,有许多 Mysql-backed、SQS 和一些其他后端的实现。

    就个人而言,我最近使用BeanstalkD 取得了很好的效果,它也有一个PHP 客户端。我只是用 JSON 序列化一些数据以投入其中,这些数据会被解码并在工作人员上运行。

    【讨论】:

      【解决方案2】:

      您尝试过 ActiveMQ 吗?它提到通过 Stomp 协议支持 PHP。详情请见the activemq site

      我已经从你描述的数据库方法中获得了很多里程,所以我不会太担心。

      【讨论】:

        【解决方案3】:

        你对服务器有完全的控制权吗?

        在这种情况下,MySQL 队列可能没问题。有一个不断运行的 PHP 脚本(在无限的 while 循环中),查询 MySQL 数据库中的新“任务”并在其间进行 sleep() 以减少空闲时间的负载。

        当每个任务完成后,在数据库中标记它并移动到下一个。

        如果你的脚本崩溃/存在(PHP 内存溢出等),为了防止整个事情停止,你可以将它放在inittab(如果你使用 Linux 作为服务器),init 会自动重启它.

        【讨论】:

        • 我喜欢 inittab 方法 - php 会随着时间的推移而泄漏内存,所以让它每分钟死一次可能不是一个坏主意
        • 我使用一个 shell 脚本,最后执行一个 'exec $0' 来重新运行自己。客户端可以随意退出并重新启动。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-09
        • 1970-01-01
        • 2021-08-25
        • 1970-01-01
        • 2014-05-27
        • 1970-01-01
        相关资源
        最近更新 更多