wait_timeout是协程等待可用连接的最长时间(推荐2.0~5.0),max_idle_time是连接在池中空闲后被主动关闭的时限(须小于数据库wait_timeout并配合heartbeat使用),二者作用对象与机制完全不同。

wait_timeout 是协程从连接池里“等连接”的最长时间,max_idle_time 是连接在池里“空闲多久就自动关掉”的时限——两者作用对象、触发时机、影响范围完全不同。
wait_timeout:协程排队时的耐心上限
这个值控制的是:当一个协程调用 $db->query() 或 $redis->get() 时,如果池中暂时没有可用连接,它最多愿意等几秒。超时就直接抛 WaitTimeoutException。
- 设太小(如 0.1),高并发下大量协程还没轮上就失败,报 “No available connection” 或 “Connection has been closed”,掩盖真实瓶颈
- 设太大(如 10),协程会长时间卡住,拖慢响应,还可能堆积导致雪崩
- 推荐值:2.0~5.0,业务有短时尖峰可设为 3.0
max_idle_time:连接在池里的“保质期”
这个值决定:一条连接被归还到池中后,如果一直没人用,最多空闲多少秒,就会被连接池主动 close 掉。它防止连接因数据库 wait_timeout、防火墙回收等被静默断开后还留在池里。
- 必须严格小于数据库的
wait_timeout(比如 MySQL 实际是 300 秒,这里最多设 270) - 单独设它不够——若连接已失效但还没到空闲超时,仍可能被分配出去,执行时报 “server has gone away”
- 需配合
heartbeat使用,形成双保险:心跳探测失败立即剔除,空闲超时兜底释放
它们不是同一类参数,不能互相替代
wait_timeout 管的是“人等资源”,max_idle_time 管的是“资源自身寿命”。前者影响请求成功率与用户体验,后者影响连接有效性与稳定性。配置时必须分开看待:
- 查 MySQL 实际
wait_timeout:SHOW VARIABLES LIKE 'wait_timeout'; - 设
max_idle_time = MySQL_wait_timeout - 30 - 设
heartbeat = max_idle_time / 2(如 270 → 135) - 设
wait_timeout = 3.0,给协程合理排队窗口











