常驻内存PHPswoole程序redis丢失长连接怎么解决?

发布于 2022-09-11 23:53:21 字数 1803 浏览 17 评论 0

大神好:我用ESD框架 开发了一个websocket服务,redis,mysql都是连接池实来的,esd框架虽并不完善但也做了连接超时断开后,再次使用上连接时会重连,但发现一夜过后(也就是长达7,8个小时没有人使用)redis长连接重连时失败了。报如下错误:
read error on connectionNOAUTH Authentication required. 后面这个其实是密码没认证而已,但明显配置是没问题的,只要我重启服务,问题就没有了。
可是不可能靠重启解决问题。 我看了下redis服务器的配置,连接空闲断开的选项是没有启用的,也就是说redis都是长连接。客户端也是使用了不超时选项的。下面这获取redis连接的方法,重点是这一行:$db->setOption(\Redis::OPT_READ_TIMEOUT, -1); 是不会超时的:

    /**
     * @return \Redis
     * @throws RedisException
     */
    public function db(): Redis
    {
        $db = getContextValue("Redis:{$this->getRedisConfig()->getName()}");
        if ($db == null) {
            $db = $this->pool->pop();
            if($db instanceof Redis){
               if(!$db->isConnected()){
                   if(!$db->connect($this->redisConfig->getHost(),$this->redisConfig->getPort())){
                       throw new RedisException($db->getLastError());
                   }
                   $db->setOption(\Redis::OPT_READ_TIMEOUT, -1);
                   if(!empty($this->redisConfig->getPassword())){
                       if(!$db->auth($this->redisConfig->getPassword())){
                           throw new RedisException($db->getLastError());
                       }
                   }
                   $db->select($this->redisConfig->getSelectDb());
               }
            }
            defer(function () use ($db) {
                $this->pool->push($db);
            });
            setContextValue("Redis:{$this->getRedisConfig()->getName()}", $db);
        }
        return $db;
    }

但还是出现了开头说的那种错误, 是什么原因?如何解决?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文