开发者社区> 问答> 正文

使用php脚本循环消费队列时,redis报错redisException: Co?400报错

因为使用rabbitmq队列循环消费,也就是while true, php脚本一直运行,同时连接redis时使用的是单例,不会每次都重新new。然后redis连接过一段时间(大概一个小时)后会由established状态变为close_wait状态。然后队列有数据,开始消费时,调用redis就会抛出异常redisException: Connection lost in xxxxxxx;

    初步猜测是因为,redis连接长时间无数据交互,而服务端主动关闭连接导致的,只是猜测,请问到底是什么原因,有遇到过的么?

展开
收起
爱吃鱼的程序员 2020-06-07 17:47:43 1252 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB
                        <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>
    
    2020-06-07 17:47:55
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
PHP安全开发:从白帽角度做安全 立即下载
PHP 2017.北京 全球开发者大会——高可用的PHP 立即下载
复杂PHP系统性能瓶颈排查及优化 立即下载