繁体   English   中英

PHP中的Message Queue

[英]Message Queue in PHP

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

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

我读过这个但是没试过。

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

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

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

是的,这很可能使用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)混淆while(true) - 上面的代码没有在无限循环中运行。 brPop异步等待,直到队列中有新消息。

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

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

您的问题远不清楚您的系统目前是如何运作的。

当一条新消息到来时,slave.php应该异步执行。

这句话是矛盾的。 如果消息的处理是异步发生的,那么根据定义它并不依赖于消息的创建。

我怀疑问题在于你没有守护进程来处理消息的出列 - 但是解释如何编写这样的程序远远超出了答案的范围。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM