0%

redis连接报错read error on connection解决

问题描述

用redis作 消息队列,php连接redis,用brpop函数消费队列时,60秒连接会自动断开,报错:read error on connection

redis

原因分析

查看了下php.ini文件里面有个参数default_socket_timeout = 60,就是这个配置导致redis过60秒会自动断开。
这个配置是什么意思?default_socket_timeout是socket流的超时参数,即socket流从建立到传输再到关闭整个过程必须要在这个参数设置的时间以内完成,如果不能完成,那么PHP将自动结束这个socket并返回一个警告。

由于php得redis扩展是基于php 的socket方式实现,因此该参数值同样会起作用。在redis里面brpop会建立一个socket流,如果这个socket流建立之后超过特定的时间都没有返回则会自动结束该socket流。

解决方案1

动态修改 php.ini , 在连接redis处把 default_socket_timeout 这个参数设置成-1 不超时即可。

1
ini_set('default_socket_timeout', -1);

解决方案2

设置 redis 的超时时间为不超时:
$redis->setOption(\Redis::OPT_READ_TIMEOUT, -1);

1
2
3
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->setOption(\Redis::OPT_READ_TIMEOUT, -1);