webman使用GatewayWorker,过一段时间Redis报错

黑老怪

问题描述

运行过一段时间就提示这个,这是被Redis回收了链接吗?

Workerman Redis Connection Error 2 client closed

程序代码

#14 {main}Exception: Workerman Redis Connection Error 2 client closed in /www/wwwroot/soa2.0/WL/vendor/workerman/redis/src/Client.php:349
        Stack trace:
        #0 /www/wwwroot/soa2.0/WL/vendor/workerman/workerman/Connection/TcpConnection.php(378): Workerman\Redis\Client->Workerman\Redis\{closure}()
        #1 /www/wwwroot/soa2.0/WL/vendor/workerman/redis/src/Client.php(467): Workerman\Connection\TcpConnection->send()
        #2 /www/wwwroot/soa2.0/WL/vendor/workerman/redis/src/Client.php(413): Workerman\Redis\Client->process()
        #3 /www/wwwroot/soa2.0/WL/vendor/workerman/workerman/Connection/TcpConnection.php(646): Workerman\Redis\Client->Workerman\Redis\{closure}()
        #4 [internal function]: Workerman\Connection\TcpConnection->baseRead()
        #5 /www/wwwroot/soa2.0/WL/vendor/workerman/workerman/Events/Event.php(193): EventBase->loop()
        #6 /www/wwwroot/soa2.0/WL/vendor/workerman/workerman/Worker.php(1638): Workerman\Events\Event->loop()
        #7 /www/wwwroot/soa2.0/WL/vendor/workerman/workerman/Worker.php(1429): Workerman\Worker::forkOneWorkerForLinux()
        #8 /www/wwwroot/soa2.0/WL/vendor/workerman/workerman/Worker.php(1403): Workerman\Worker::forkWorkersForLinux()
        #9 /www/wwwroot/soa2.0/WL/vendor/workerman/workerman/Worker.php(1788): Workerman\Worker::forkWorkers()
        #10 /www/wwwroot/soa2.0/WL/vendor/workerman/workerman/Worker.php(1724): Workerman\Worker::monitorWorkersForLinux()
        #11 /www/wwwroot/soa2.0/WL/vendor/workerman/workerman/Worker.php(562): Workerman\Worker::monitorWorkers()
        #12 /www/wwwroot/soa2.0/WL/vendor/workerman/webman-framework/src/support/App.php(131): Workerman\Worker::runAll()
        #13 /www/wwwroot/soa2.0/WL/start.php(4): support\App::run()
245 1 0
1个回答

leedom

Redis 配置限制:
Redis 最大连接数(maxclients)已满,新连接被拒绝后关闭。
Redis 超时设置(timeout)过短,空闲连接被服务器主动关闭。
检查 Redis 日志(通常在 redis.conf 中配置的 logfile 路径),确认是否有崩溃、内存溢出(OOM)等异常。

maxclients 100000  # 根据服务器内存调整
timeout 0  # 禁用自动关闭空闲连接(推荐)

优化 Workerman 客户端连接管理
Workerman 的 Redis 客户端支持连接断开后自动重连,需在初始化时配置 reconnect 参数:

$redis = new Client([
    'host' => '127.0.0.1',
    'port' => 6379,
    'reconnect' => 3,  // 连接断开后重试 3 次(每次间隔 1 秒)
]);

避免频繁创建连接:
确保 Redis 客户端实例被复用(如全局单例),而非每次请求创建新连接,减少连接开销:

// 单例模式示例
class RedisClient {
    private static $instance;
    public static function getInstance() {
        if (!self::$instance) {
            self::$instance = new \Workerman\Redis\Client([
                'host' => '127.0.0.1',
                'port' => 6379,
            ]);
        }
        return self::$instance;
    }
}

// 使用时
$redis = RedisClient::getInstance();

检查 Workerman 与 PHP 环境
更新 Workerman 及 Redis 客户端:
旧版本可能存在连接处理 Bug,升级到最新稳定版:

composer update workerman/workerman workerman/redis
  • 暂无评论
🔝