在使用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流。

解决办法:

一、

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

ini_set('default_socket_timeout', -1);

二、

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

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