PHP 中的消息队列
Posted
技术标签:
【中文标题】PHP 中的消息队列【英文标题】:Message Queue in PHP 【发布时间】:2014-01-11 13:23:59 【问题描述】:我开发了一个 rest api,它接受一些数据并将其存储在消息队列(Redis 列表)中。现在从 redis 将这些数据推送到 mysql 数据库中。 问题是客户端需要等到数据写入mysql。
我希望客户端应该等到数据写入消息队列(Redis 列表)并且将数据推送到 MySQL 的函数应该异步执行。 我该怎么做 ?我的整个代码库都是 php 的,所以我更喜欢 PHP。
我已阅读此内容,但未尝试过。
Distributed queue example in PHP using Redis
我对如何执行 slave.php(链接中提到的)感到困惑。我的意思是当队列中有新消息到达时,slave.php 将如何找到它。
我不想为此使用 cronjob。相反,当新消息到达时,slave.php 应该异步执行。怎么办?
【问题讨论】:
【参考方案1】:是的,这很可能使用 Memqueue、Redis 等。
使用 Redis,可以这样做:
这个 PHP 文件在收到消息时将消息推送到队列中:
/*
Code logic
*/
$redis->lPush("message_queue", "message 1");
一个slave.php
使用brPop
执行“阻塞弹出”:
$redis = new Redis();
$redis->pconnect();
while (true)
list($queue, $message) = $redis->brPop(["message_queue"], 0);
/*
Logic to insert $message to MySQL
*/
现在,每当有新消息到达时,slave.php
都会捕获它并将其推送到 MySQL。
不要被while(true)
弄糊涂了 - 上面的代码不是在无限循环中运行。 brPop
异步等待,直到队列中有新消息。
我正在使用 PHP 5.4 并连接到 Redis 2.6 及更高版本工作正常。更好的是,您可以拥有多个 slave.php
文件并分散负载。
更多详情:http://redis.io/commands/blpop
【讨论】:
Hii Manu..感谢您的回答。它对我有用。但是有一个问题。当列表为空时,slave.php 只等待几分钟,然后抛出一些异常。一旦阻塞连接,即使新数据到达列表中,它也不会监听。我添加了一个新问题,其中提到了我的代码和错误消息。这是链接:***.com/questions/20972743/…你能帮忙吗?谢谢 @NeelKamal 或任何其他寻找超时其他问题的人,我已经在那边提供了答案***.com/questions/20972743/…【参考方案2】:您的问题远不清楚您的系统当前是如何工作的。
当有新消息到达时,slave.php 应该异步执行。
这句话是矛盾的。如果消息的处理是异步发生的,那么根据定义,它与消息的创建无关。
我怀疑问题在于您没有处理消息出列的守护程序 - 但是解释如何编写这样的程序超出了这里的答案范围。
【讨论】:
在阅读此链接redis4you.com/code.php?id=012 后,该声明重新引起了我的怀疑。系统工作流程在第一和第二段中提到以上是关于PHP 中的消息队列的主要内容,如果未能解决你的问题,请参考以下文章