php - PHP 中的消息队列

标签 php asynchronous redis message-queue

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

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

我读过这个但还没有尝试过。

Distributed queue example in PHP using 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) 搞糊涂了——上面的代码不是在无限循环中运行。 brPop 异步等待队列中有新消息。

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

更多详情:http://redis.io/commands/blpop

关于php - PHP 中的消息队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20741614/

相关文章:

php - Mysql 从 1 个查询中选择第二行

php - 如何从我的 wordpress 页面获取特色图片描述?

java - 为什么我无法在@Async 方法中取回结果? ("IllegalStateException: EntityManagerFactory is closed"被抛出)

java - Spring Data Redis 支持 Externalizable 吗?

mysql - 使用 Redis 作为事件流的键/值存储

serialization - REDIS 中 HMSET 的 RESP 格式

php - 如何在 PHP 中用 替换制表符?

PHP/MYSQL - 使用联合更新子查询选择

javascript - 使用回调的意义和原因?

c# - 下载数千个网页的最有效方法