运行Zend队列接收器的基础结构

时间:2009-11-30 17:59:22

标签: php zend-framework cron zend-queue

我有一个简单的消息传递队列设置并使用Zend_Queue对象层次结构运行。我正在使用Zend_Queue_Adapter_Db后端。我有兴趣将其用作作业队列,以便在以后安排处理。他们的工作不需要立即发生,但应该尽早而不是发生。

是否有最佳实践/标准方法来设置基础架构以运行作业?我理解从队列接收消息的代码,但对我来说不太清楚的是如何运行执行该接收的程序。在命令行上接收n条消息的cron,每分钟运行一次?一个启动多个Web请求的cron,每个Web请求都运行接收器脚本?还有别的吗?

切向奖金问题。如果我正在使用Zend_Db运行其他查询,那么消息队列查询是否会被视为该事务的一部分?

1 个答案:

答案 0 :(得分:2)

你可以像线程池那样做。创建一个命令行php脚本来处理接收。它应该由shell脚本启动,如果它死了则会自动重启该进程。如果shell脚本已经在运行,则它不应该启动该进程(使用$ pid.running文件或类似文件)。让cron每1-10分钟运行几个。这应该很好地处理接收。

我不会让cron发出Web请求,除非你的cron出于某种奇怪的原因而在另一台服务器上。

使用它的另一种方法是让一些背景进程创建数据,并且Web用户在自然浏览网站时使用它。报告生成器可能以这种方式工作。公司范围的报告可供所有用户使用,但您不希望它们都生成此数据库/时间密集型报告。因此,您可以创建一个队列,并一次处理一个队列,删除重复项。所有用户都可以在准备好后查看报告。

According to the docs看起来zend db甚至没有使用与其他zend_db查询相同的连接。但当然,找出答案的最佳方法是进行简单的测试。

修改的 cron中的多行用于并发。每行代表池的工作者。我不清楚,你不希望pid作为标识符,你想把它作为参数传递。

          • /home/byron/run_queue.sh Process1
          • /home/byron/run_queue.sh Process2
          • /home/byron/run_queue.sh Process3

如果发现$ process.running文件退出,bash脚本将检查$ process.running文件。

否则:

  • 创建$ process.running文件。
  • 启动php进程。阻止/等到完成。
  • 删除$ process.running文件。

这允许php脚本死掉但不会导致池松动工人。

如果队列为空,则php脚本立即退出,并通过nex调用cron再次启动。