常驻内存PHPswoole程序redis丢失长连接怎么解决?
大神好:我用ESD框架 开发了一个websocket服务,redis,mysql都是连接池实来的,esd框架虽并不完善但也做了连接超时断开后,再次使用上连接时会重连,但发现一夜过后(也就是长达7,8个小时没有人使用)redis长连接重连时失败了。报如下错误:read error on connection
或NOAUTH 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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论