運(yùn)行過一段時(shí)間就提示這個(gè),這是被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()
Redis 配置限制:
Redis 最大連接數(shù)(maxclients)已滿,新連接被拒絕后關(guān)閉。
Redis 超時(shí)設(shè)置(timeout)過短,空閑連接被服務(wù)器主動(dòng)關(guān)閉。
檢查 Redis 日志(通常在 redis.conf 中配置的 logfile 路徑),確認(rèn)是否有崩潰、內(nèi)存溢出(OOM)等異常。
maxclients 100000 # 根據(jù)服務(wù)器內(nèi)存調(diào)整
timeout 0 # 禁用自動(dòng)關(guān)閉空閑連接(推薦)
優(yōu)化 Workerman 客戶端連接管理
Workerman 的 Redis 客戶端支持連接斷開后自動(dòng)重連,需在初始化時(shí)配置 reconnect 參數(shù):
$redis = new Client([
'host' => '127.0.0.1',
'port' => 6379,
'reconnect' => 3, // 連接斷開后重試 3 次(每次間隔 1 秒)
]);
避免頻繁創(chuàng)建連接:
確保 Redis 客戶端實(shí)例被復(fù)用(如全局單例),而非每次請(qǐng)求創(chuàng)建新連接,減少連接開銷:
// 單例模式示例
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;
}
}
// 使用時(shí)
$redis = RedisClient::getInstance();
檢查 Workerman 與 PHP 環(huán)境
更新 Workerman 及 Redis 客戶端:
舊版本可能存在連接處理 Bug,升級(jí)到最新穩(wěn)定版:
composer update workerman/workerman workerman/redis