PHP中的Message Queue

Nee*_*mal 6 php asynchronous message-queue redis

我开发了一个rest api,它接受一些数据并将其存储在消息队列(Redis List)中.现在从redis这个数据被推送到MySQL数据库.问题是客户端需要等到数据写入mysql.

我希望客户端应该等到数据写入消息队列(Redis List),并且将数据推送到MySQL的函数应该异步执行.我该怎么做 ?我的整个代码库都是用PHP编写的,所以我更喜欢用PHP编写代码.

我读过这个,但没试过.

PHP中使用Redis的分布式队列示例

我很困惑如何执行slave.php(在链接中提到).我的意思是当一条新消息到达队列时,slave.php将如何找到它.

我不想为此使用cronjob.相反,当新消息到达时,slave.php应该异步执行.怎么做?

Man*_*ath 11

是的,这很可能使用Memqueue,Redis等.

使用Redis,这就是人们可以做到的:

这个PHP文件在获取它时将消息推送到队列中:

/*
    Code logic
*/
$redis->lPush("message_queue", "message 1");
Run Code Online (Sandbox Code Playgroud)

A slave.php使用以下方式执行"阻止弹出" brPop:

$redis = new Redis();
$redis->pconnect();

while (true) {
    list($queue, $message) = $redis->brPop(["message_queue"], 0);
    /*
    Logic to insert $message to MySQL
    */
}
Run Code Online (Sandbox Code Playgroud)

现在每当有新消息到达时,它slave.php都会抓住它并将其推送到MySQL.

不要混淆while(true)- 上面的代码没有在无限循环中运行.在brPop异步等待直到出现在队列中的新消息.

我正在使用PHP 5.4并连接到Redis 2.6及以上版本工作正常.更好的是,您可以拥有多个slave.php文件并分配负载.

有关更多详细信息,请访问:http://redis.io/commands/blpop

  • Hii Manu ..谢谢你的回答.它对我有用.但是有一个问题.当列表为空时,slave.php只会等待几分钟后抛出一些异常.一旦阻止连接,即使新数据到达列表,它也不会监听.我添加了一个新问题,其中提到了我的代码和错误消息.这是链接:http://stackoverflow.com/questions/20972743/error-in-implementing-message-queue-using-redis-error-in-using-blpop你能帮忙吗?谢谢 (3认同)