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