Hyperf在Swow环境下必须使用Swow专用连接池结构,删除原pool数组并配置min_connections、max_connections等参数,启用heartbeat与合理check_interval,并强制清空runtime/container缓存才能生效。

Hyperf 默认 MySQL 连接池参数在 Swow 环境下会失效,直接改 pool 数组里的旧字段没用;必须切换到 Swow 专用结构,否则会出现 Pool exhausted、idle 连接不回收、连接数突增等问题。
确认 Swow 已启用且版本 ≥1.5.0
执行 php bin/hyperf.php start 后,控制台输出必须含 Swow\Coroutine\Channel 字样。若没有:
- 检查
config/autoload/server.php中'mode' => SWOW_BASE是否已设置(不是SWOOLE_BASE) - 运行
composer show swow/swow确认版本 ≥1.5.0;低于则需composer update swow/swow - 旧版 Swow 或未启用时,所有新
pool参数会被忽略,退化为 Swoole 兼容层行为
删除旧 pool 配置,改用 Swow 专用结构
在 config/autoload/databases.php 的 MySQL 配置块中,必须彻底删除原 'pool' 一级数组(哪怕只留空),否则 Swow 不识别新配置。
在 'driver' => 'mysql' 同级新增:
'pool' => [
'min_connections' => 8,
'max_connections' => 64,
'connect_timeout' => 5.0,
'wait_timeout' => 2.0,
'heartbeat' => true,
'retry_interval' => 100,
'check_interval' => 3000,
],
-
check_interval单位是毫秒,Swow 强制 ≥3000,设小了会导致心跳异常中断 -
retry_interval不能为 0,否则连接失败后永不重试 -
wait_timeout建议设 2.0~5.0:小于 1.0 容易误抛WaitTimeoutException;大于 8.0 会掩盖真实瓶颈(如连接泄漏)
强制清空容器缓存并重启
Swow 会缓存旧 Pool 类实例,仅改配置文件不生效:
- 执行
rm -rf runtime/container - 再运行
php bin/hyperf.php start - 启动后检查日志是否有
Swow\Coroutine\Channel和MySQL pool initialized,确认新配置加载成功
漏掉清缓存是最常见的“改了没用”原因——旧 Pool 实例还在内存里跑着,新参数根本没被读取。



















