Hyperf 3.2 升级 Swow 后连接池报错的根源是 Swow 不兼容旧版配置结构,需彻底删除旧 pool 配置、按 Swow 专用规范重写(pool 与 driver 平级),填入 check_interval≥3000、retry_interval≠0、max_idle_time≤MySQL wait_timeout、heartbeat=true、max_connections合理设置,并清空 runtime/container 缓存后重启。

Hyperf 3.2 升级 Swow 后连接池报错,核心原因不是参数写错,而是 Swow 完全不识别旧版配置结构,会静默跳过或沿用兼容层导致连接泄漏、WaitTimeoutException、MySQL server has gone away 等问题。必须按 Swow 专用规范重配,且清理缓存。
确认 Swow 已正确启用
启动服务后检查控制台输出,应含 Swow\Coroutine\Channel 字样。若无,需确认:
- config/autoload/server.php 中
'mode' => SWOW_BASE(不是SWOOLE_BASE) - PHP 已加载 swow.so 扩展(
php -m | grep swow) - Swow 版本 ≥ 1.5.0(
php --ri swow查看)
删除所有旧 pool 配置,改用 Swow 专用结构
在 config/autoload/databases.php 中,不能把 'pool' 写在数据库配置最外层或嵌套错误层级。必须与 'driver' 平级,并确保全局只有一处 'pool' 块:
- ❌ 错误示例:在
'default' => [ ... 'pool' => [...] ]里定义 - ✅ 正确写法:在
'mysql' => [ 'driver' => 'mysql', ..., 'pool' => [...] ]中定义 - 务必删干净原配置中任何残留的
'pool'数组,否则 Swow 会忽略新设置
填入 Swow 强制要求的关键参数
以下参数缺一不可,且值有硬性约束:
-
'check_interval' => 3000:单位毫秒,必须 ≥ 3000,否则心跳检测中断 -
'retry_interval' => 100:不能为 0,否则连接失败后永不重试 -
'max_idle_time' => 86000:单位毫秒,必须 ≤ MySQL 的wait_timeout(查SHOW VARIABLES LIKE 'wait_timeout'),建议比它小 30–60 秒 -
'heartbeat' => true:必须显式开启,否则无效连接无法被剔除 -
'max_connections' => 32:建议设为 16–64 区间,按公式min(服务端总连接数 ÷ Worker 数, 协程峰值 × 0.4)动态计算
清空缓存并重启服务
配置改完不生效?大概率是容器缓存未更新:
- 执行
rm -rf runtime/container - 再运行
php bin/hyperf.php start - 不要跳过这步——旧 Pool 类实例会残留,新配置完全不加载


















