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

2022-08-30 17:03:48

我正在使用predis,它订阅了一个频道并收听。它会抛出以下错误(如下),并在60秒后完全死亡。这肯定不是我的Web服务器错误或其超时。

这里也讨论了一个类似的问题。不能得到很多。

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

另外,如果我继续使用(向它发送数据并处理)工作线程,它不会给出任何错误。因此,它可能是某个地方的超时,并且与此相关。

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

$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 超时,它也被禁用了。


答案 1

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

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

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

如果要在类似守护程序的脚本中使用 Predis,则应设置为“如果要完全禁用超时”(此值适用于较旧和较新版本的 Predis)。另外,请记住,您必须通过在 redis.conf 中设置来禁用 Redis 的默认超时,否则 Redis 将在 300 秒不活动后断开空闲客户端的连接。read_write_timeout-1timeout = 0


答案 2

我遇到了类似的问题,更好的解决方案不是将超时设置为0,而是使用指数退避并设置上限和下限。将配置参数connection_timeout更改为 0 也将解决此问题。


推荐