thinkphp6+think-swoole偶尔出现 AUTH failed while reconnecting Redis server went away

伟大的python程序员 2023-06-09 14:34:01

thinkphp6+think-swoole偶尔出现 AUTH failed while reconnecting Redis server went away

有大佬知道咋解决吗

有秘密认证,非防火墙原因。

项目正常运行几天后就会报错,然后重启php think swoole就又好了。

不知道那里出了问题

...全文
8666 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
SCTGO 01-10
  • 打赏
  • 举报
回复

明白了,既然是有密码认证且运行一段时间后出现的问题,这很可能是因为Redis连接池或长连接管理的问题。以下是几个针对性的解决方案:

  1. 优化连接池配置
    config/swoole.php 中添加或修改 Redis 连接池配置:
return [
    'pool' => [
        'redis' => [
            'enabled' => true,
            'max_active' => 100,      // 最大活动连接数
            'max_wait_time' => 5,     // 等待连接的超时时间(秒)
            'max_idle_time' => 30,    // 连接最大闲置时间(秒)
            'min_idle' => 5,          // 最小空闲连接数
            'heartbeat' => 60,        // 心跳检测间隔(秒)
        ],
    ],
];
  1. 添加断线重连机制
    在使用 Redis 的地方添加重试逻辑:
class Redis
{
    protected $maxRetries = 3;
    
    public function command($name, ...$arguments)
    {
        $attempts = 0;
        while ($attempts < $this->maxRetries) {
            try {
                return $this->connection->$name(...$arguments);
            } catch (\RedisException $e) {
                $attempts++;
                if (strpos($e->getMessage(), 'went away') !== false || 
                    strpos($e->getMessage(), 'AUTH failed') !== false) {
                    // 重新连接
                    $this->reconnect();
                    continue;
                }
                throw $e;
            }
        }
    }
}
  1. 修改 Redis 服务端配置
    在 Redis 服务器的 redis.conf 中调整以下参数:
timeout 0                    # 客户端超时时间,0为永不超时
tcp-keepalive 300           # TCP keepalive 心跳检测间隔
  1. 定时检测连接状态
    在 Swoole 的定时任务中添加连接检测:
// 在服务启动时添加定时任务
public function onWorkerStart($server, $workerId)
{
    if ($workerId == 0) {
        \Swoole\Timer::tick(30000, function () {
            try {
                $redis = cache()->store('redis')->handler();
                $redis->ping();
            } catch (\Exception $e) {
                // 记录日志
                \think\facade\Log::error('Redis connection lost: ' . $e->getMessage());
                // 尝试重新连接
                $this->reconnectRedis();
            }
        });
    }
}
  1. 增加错误日志记录
    添加详细的日志记录以便追踪问题:
// 在配置文件中开启日志
'redis' => [
    'type'   => 'redis',
    // ... 其他配置 ...
    'log_level' => ['error'], // 记录错误日志
],
  1. 优化连接管理
    在服务重启时确保正确关闭连接:
public function onShutdown($server)
{
    try {
        $redis = cache()->store('redis')->handler();
        $redis->close();
    } catch (\Exception $e) {
        \think\facade\Log::error('Redis shutdown error: ' . $e->getMessage());
    }
}

建议实施步骤:

  1. 首先实施第1点和第3点,这是最基本的优化。
  2. 添加第4点的定时检测机制。
  3. 开启详细的日志记录(第5点),以便监控问题。
  4. 如果问题仍然存在,则实施第2点的重试机制。

另外,建议监控:

  • Redis 连接数
  • 内存使用情况
  • 网络延迟
  • 错误日志

如果实施这些措施后问题仍然存在,建议收集以下信息进行进一步分析:

  1. Redis 服务器的错误日志
  2. 应用程序的错误日志
  3. 问题出现时的系统负载状况
  4. 网络连接状态

这些措施应该能够显著提高 Redis 连接的稳定性,减少 AUTH failed 错误的出现。

  • 打赏
  • 举报
回复

遇到非常相似的问题,请问群主解决了吗?

21,893

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧