Hyperf 3.0 的 pool.heartbeat 是需协同配置的心跳周期值,必须为大于0的整数(如30),且满足 heartbeat
Hyperf 3.0 的
pool.heartbeat不是“开/关”式配置,而是一个带语义的检测周期值,必须设为正整数(单位:秒),且需与其他连接池参数协同生效,否则不起作用。心跳检测必须满足的三个前提
heartbeat值必须是 大于 0 的整数(如30),设为-1表示禁用,设为0会报错或被忽略- 它只对空闲连接生效,即连接当前未被协程占用、处于等待复用状态
- 必须配合
max_idle_time使用:heartbeat ,否则连接在心跳触发前就被回收了,检测无意义推荐配置组合(适配常见 MySQL 生产环境)
在
config/autoload/db.php对应数据库配置的pool下设置:'pool' => [ 'min_connections' => 1, 'max_connections' => 10, 'connect_timeout' => 10.0, 'wait_timeout' => 5.0, // 协程等待空闲连接最多 5 秒,防排队雪崩 'heartbeat' => 30, // 每 30 秒探活一次空闲连接 'max_idle_time' => 60.0, // 连接空闲满 60 秒强制回收 ], 'options' => [ \PDO::ATTR_TIMEOUT => 3, // PDO 执行超时 3 秒,避免慢查询拖垮连接 ],为什么这样配?
- MySQL 默认
wait_timeout = 28800,但生产常调为300–600秒;设heartbeat=30可在连接被 MySQL 主动断开前及时发现并剔除max_idle_time=60留出缓冲窗口,确保心跳有足够机会执行wait_timeout=5.0防止协程无限等待一个已失效但尚未被心跳清理的连接ATTR_TIMEOUT=3是兜底:即使连接还“活着”,单条 SQL 超过 3 秒也会中断,不占用连接资源配置位置和验证要点
- ❗ 必须写在具体数据库配置里(如
'default' => [...]中的pool键下),不是全局或顶层配置- 日志里看到
heartbeat started只代表初始化成功,不代表它在持续工作- 真实生效要看:低频请求后突然发请求是否不再报
2006 MySQL server has gone away,以及SHOW PROCESSLIST中长时间空闲连接是否被及时断开不复杂但容易忽略。












