一尘不染

Predis提供“从服务器读取行时出错”

redis

我正在使用predis并订阅了频道并进行监听,它抛出错误并死了,如下图所示,过了60秒后,肯定不是我的Web服务器错误或超时。

目前正在讨论的一个类似的问题在这里。无法得到太多。

我尝试将predis conf文件中的connection_timeout设置为0,但没有太大帮助。

另外,如果我继续使用(向其发送数据并进行处理)该工作程序,则不会出现任何错误。因此,它可能在某处超时,并且在连接方面也是如此。

这是我的代码段,可能会产生错误,因为如果将数据提供给工作程序,它将运行该代码并继续前进,此后不会产生任何错误。

$pubsub = $redis->pubSub();
$pubsub->subscribe($channel1);

foreach ($pubsub as $message) { //doing stuff here and unsubscribing from channel
}

跟踪

PHP Fatal error:  Uncaught exception 'Predis\Network\ConnectionException' with message 'Error while reading line from the server' in Predis/Network/ConnectionBase.php:159 Stack trace:
#0 library/vendor/predis/lib/Predis/Network/StreamConnection.php(195): Predis\Network\ConnectionBase->onConnectionError('Error while rea...')
#1 library/vendor/predis/lib/Predis/PubSub/PubSubContext.php(259): Predis\Network\StreamConnection->read()
#2 library/vendor/predis/lib/Predis/PubSub/PubSubContext.php(206): Predis\PubSub\PubSubContext->getValue()
#3 pdf/file.php(16): Predis\PubSub\PubSubContext->current()
#4 {main}   thrown in Predis/Network/ConnectionBase.php on line 159

也检查了redis.conf超时,它也被禁用。


阅读 685

收藏
2020-06-20

共1个答案

一尘不染

只需将read_write_timeout连接参数设置为0或-1即可解决此问题。例如

$redis = new Predis\Client('tcp://10.0.0.1:6379'."?read_write_timeout=0");

设置连接参数记录在README文件中。Redis的作者在GitHub上的一个问题中指出了read_write_timeout此错误与参数的相关性,他在其中指出:

如果要在类似守护程序的脚本中使用Predis,则应设置read_write_timeout-1要完全禁用超时(此值适用于Predis的较新版本)。另外,请记住,必须通过`timeout

0`在redis.conf中进行设置来禁用Redis的默认超时时间,否则Redis将在闲置300秒后断开空闲客户端的连接。

2020-06-20