可以从REDIS订阅返回响应吗?

3

我使用predis,想要在PHP中订阅频道并等待30秒。如果没有接收到任何频道消息,则返回JSON响应。或者如果频道中存在消息,则也返回响应并退出。

例如,我希望Redis::subscribe返回$message,并且我可以返回响应。

我在Laravel的控制器中有一些代码:

 Redis::subscribe(['PushAuthChanel'], function($message) {


  echo $message; // Nothing happens
  return response()->json($c, 200); // Nothing happens
  //return $message; // Nothing happens too

    });

为什么 Redis::subscribe 无法返回 $message?但是它会返回类似以下的退出代码:
Redis::subscribe(['PushAuthChanel'], function($message) {


return exit(0); //will work
dd($message); //will work fine

});
2个回答

2

您还在等待答案吗?无论如何,您可以按照以下方式更改代码:

    $pubsub = Redis::pubSubLoop();
    $pubsub->subscribe('channel-name');
    foreach ($pubsub as $message) {
        print_r ($message);
        // You can unsubscribe any time you want by using this function:
        // $pubsub->unsubscribe();
    }

看起来这解决了一半的问题——订阅和检查消息。有没有关于如何设置30秒时间间隔的提示?那需要一个外部计时器吗? - Jason

1
我遇到了类似的问题,并通过以下方式解决:连接到 Redis 时,我设置了 'read_timeout' => 30,当读取(订阅)超时时会抛出 RedisException 异常,因此我们可以捕获它。
try {
    Redis::subscribe(['channel-name'], function ($message) {
        die($message);
    });
} catch (\RedisException $exception) {
    return \Response::json([
        'timeout' => true
    ], 204);
}

在超时的情况下,代码响应 204(无内容),因此在这种情况下客户端立即重新连接(类似长轮询连接)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接