10

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

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

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

4

3 回答 3

5

你试过 ActiveMQ 吗?它提到通过 Stomp 协议支持 PHP。详细信息可在activemq 站点上找到。

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

于 2009-03-18T18:54:39.807 回答
3

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

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

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

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

于 2009-03-18T18:44:44.417 回答
2

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

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

于 2009-04-07T01:52:14.080 回答