我正在尝试使用Redis构建消息队列。 每当客户端发送新数据时,它们都会被添加到列表中。
以下是代码
$client->lPush("my_queue", $data);
现在有一个单独的脚本 slave.php ,它会弹出新到达的数据并对其进行处理。 slave.php的代码
while (true) {
list($queue, $message) = $client->brPop(["my_queue"], 0);
/*
Logic to process the data
*/
}
我修改了apache启动脚本,以便slave.php启动&用apache停下来。它运作良好。但等待几分钟后,brPop停止收听,并显示如下错误消息:
Uncaught exception 'Predis\Connection\ConnectionException' with message 'Error while reading line from the server [tcp://127.0.0.1:6379]' in /var/www/api/lib/predis-0.8/lib/Predis/Connection/AbstractConnection.php:139
Stack trace:
#0 /var/www/api/lib/predis-0.8/lib/Predis/Connection/StreamConnection.php(205): Predis\Connection\AbstractConnection->onConnectionError('Error while rea...')
#1 /var/www/api/lib/predis-0.8/lib/Predis/Connection/AbstractConnection.php(128): Predis\Connection\StreamConnection->read()
#2 /var/www/api/lib/predis-0.8/lib/Predis/Connection/AbstractConnection.php(120): Predis\Connection\AbstractConnection->readResponse(Object(Predis\Command\ListPopLastBlocking))
#3 /var/www/api/lib/predis-0.8/lib/Predis/Client.php(227): Predis\Connection\AbstractConnection->executeCommand(Object(Predis\Command\ListPopLastBlocking))
#4 /var/www/api/lib/slave.php(7): Predis\Client->__call('brPop', Array)
#5 /var/www/api/lib/slave.php(7): Predis\Client->brPop(Array, 0)
#6 {main}
thrown in /var/www/api/lib/predis-0.8/lib/Predis/Connection/AbstractConnection.php on line 139
根据文档,如果列表为空,则BLPOP / BRPOP阻止连接,直到另一个客户端对其中一个键执行LPUSH或RPUSH操作。 但在我的情况下,这不会发生。 在我的情况下,一旦brpop阻止连接,即使新数据到达列表,它也不会再次监听。
我应该做些什么改变才能让它发挥作用?
答案 0 :(得分:0)
它现在为我工作,但我不确定这是否是正确的方法。现在我正在捕获错误并在连接失败的情况下递归调用该函数。我的新slave.php看起来像这样:
function process_data()
{
try {
$client = new \Predis\Client();
require_once("logger.php");
while (true) {
list($queue, $message) = $client->brPop(["bookmark_queue"], 0);
// logic
}
} catch (Exception $ex) {
$error = $ex->getMessage();
log_error($error, "slave.php");
process_data(); // call the function recursively if connection fails
}
}
process_data(); // call the function
答案 1 :(得分:0)
将?read_write_timeout=-1
添加到您的连接字符串。
答案 2 :(得分:0)
问题不在于您的Redis配置,而是您必须更改php.ini
设置并设置
default_socket_timeout = 90 //Or whatever you would like to set
当达到最大套接字超时时,PHP将断开套接字的连接。