因为使用rabbitmq队列循环消费,也就是while true, php脚本一直运行,同时连接redis时使用的是单例,不会每次都重新new。然后redis连接过一段时间(大概一个小时)后会由established状态变为close_wait状态。然后队列有数据,开始消费时,调用redis就会抛出异常redisException: Connection lost in xxxxxxx;
初步猜测是因为,redis连接长时间无数据交互,而服务端主动关闭连接导致的,只是猜测,请问到底是什么原因,有遇到过的么?
<p>重新连接一下吧,我以前也遇到过。redis有个连接时间 看看是不是超时了</p>
可是我们的dba说redis不设置超时时间,默认为0,我测试了一下,确实一个redis连接放sleep好几个小时再调用也是正常的。
但是在线上脚本使用的时候就会出现close_wait状态,然后消费脚本就挂掉了。应该是服务器主动关闭连接了,但不知道可能的原因还有啥
<pre><code>class Redis
{ /** * @var \Redis */ private static $redis = null;
private static $start_time = 0;
private static $max_connect_time = 600;
private function __construct()
{
}
/**
* @return \Redis
*/
public static function connect(){
if(self::$redis === null || self::$start_time + self::$max_connect_time < time()) {
if(self::$redis){
self::$redis->close();
self::$redis = null;
}
self::$start_time = time();
self::$redis = new \Redis();
$conf = \App::config('Cache.redis');
self::$redis->connect($conf['host'], $conf['port'],0);
}
return self::$redis;
}
}
//调用 Redis::connect()->get
<p><img height="246" src="https://static.oschina.net/uploads/space/2018/0313/104423_sNZ0_2338485.png" width="1104"></p>
我遇到的是mysql.应该类似.如果变量还在.但实际断开的话.重新初始化一下吧...
<p>当时我们也遇到这个情况,建议你写shell脚本,</p>
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。