Predis在从服务器读取行时出现'错误'

时间:2012-08-02 10:58:43

标签: php redis

我正在使用predis并且它订阅了一个频道并且正在监听,它会抛出错误并死掉,如下所示,在60秒之后,它肯定不是我的网络服务器错误或其超时。

正在讨论类似的问题here。无法得到太多。

我尝试将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超时,它也被禁用了。

4 个答案:

答案 0 :(得分:34)

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

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

设置连接参数为documented in the README。 Redis的作者在an issue on GitHub中注意到read_write_timeout参数与此错误的相关性,其中他指出:

  

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

答案 1 :(得分:3)

我有类似的问题,更好的解决方案是没有将超时设置为0但使用指数退避并设置上限和下限。 将config参数connection_timeout更改为0也可以解决问题。

答案 2 :(得分:1)

我得到了解决问题的方法。因此,应用程序服务器可以连接到另一台计算机上的特定应用程序的端口存在限制。这些港口已经筋疲力尽了。 我们增加了限制,问题得到了解决。

我们如何了解这个问题? 在php中,我们在创建套接字时遇到“无法分配请求的地址”错误(错误代码99)。

答案 3 :(得分:0)

/etc/redis/redis.conf 处设置

timeout = 0