可以从REDIS订阅返回回复吗?

时间:2017-07-09 16:07:12

标签: php laravel redis subscribe predis

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

例如我想,我的Redis :: subscribe返回$ message,我可以返回响应。

我在Laravel的Controller中有一些代码:

 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 个答案:

答案 0 :(得分: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();
    }

答案 1 :(得分: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(无内容),因此在这种情况下客户端立即再次连接(长轮询连接)