我正在使用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超时,它也被禁用。
只需将read_write_timeout连接参数设置为0或-1即可解决此问题。例如
read_write_timeout
$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秒后断开空闲客户端的连接。
-1
0`在redis.conf中进行设置来禁用Redis的默认超时时间,否则Redis将在闲置300秒后断开空闲客户端的连接。