Pie*_*ter 11
AMQPQueue :: consume方法现在是PHP AMQP库(http://www.php.net/manual/en/amqpqueue.consume.php)1.0版本的basic.consume的"正确"实现.不幸的是,由于PHP是单线程语言,因此在同一进程空间中等待消息时,您无法执行其他操作.如果您调用AMQPQueue :: consume并将其传递回调,则整个应用程序将阻塞并等待代理发送下一条消息,此时它将调用提供的回调函数.如果你想要一个非阻塞方法,你将不得不使用AMQPQueue :: get(http://www.php.net/manual/en/amqpqueue.get.php),它将轮询服务器以获取消息,并返回如果没有消息,则为布尔值FALSE.
我不同意scvatex的建议,即使用单独的语言来使用"推"方法解决这个问题.PHP不是由IO驱动的,因此在消息到达时使用单独的语言调用PHP脚本似乎是不必要的复杂性:为什么不使用AMQPQueue :: consume并让进程阻塞(等待消息),并且要么全部放入回调中的逻辑或使回调运行单独的PHP脚本.
我们在我的工作中完成了后者作为一个大规模的作业处理系统,这样我们就可以分离错误并保持父作业处理器的运行,无论孩子们发生什么.如果您想详细描述我们如何设置它以及一些代码示例,我会非常乐意发布它们.
scv*_*lex 10
你想要的是basic.consume,它允许代理将消息推送到客户端.
也就是说,库的实现方式不同.他们中的大多数都支持basic.consume,但由于所使用的框架的固有限制,有些不支持(最值得注意的是许多其他客户端所基于的官方RabbitMQ C客户端).
如果您的PHP库不支持basic.consume,您必须使用轮询(错误),或者您可以使用一个更完整的客户端来驱动脚本.例如,您可以编写从代理消耗的Python或Java程序(因此,代理将交付推送给它们),并且只要收到新消息,他们就可以调用脚本.该官方教程是一个伟大的介绍AMQP API和是一个良好的开端.
从大多数角度来看,这是有效的,但它确实需要与代理的稳定连接.
如果对各种客户的能力有疑问,或者您需要更多指导,RabbitMQ Discuss邮件列表是提问的好地方.开发人员回答那里发布的任何查询.
| 归档时间: |
|
| 查看次数: |
8381 次 |
| 最近记录: |