如何设置ThinkPHP数据库连接池泄露检测周期,自定义扫描间隔时间?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1205个文字,预计阅读时间需要5分钟。
ThinkPHP的数据库连接池(基于`think\db\Connection`和底层PDO)是一种懒连接+复用+自动释放机制,它没有内置的连接泄露扫描器、活跃心跳探测或超时回收逻辑。所谓的连接泄露检测周期在官方代码中基本不存在——即使你配置了,也可能无效。
常见错误现象:max_connections 被耗尽、MySQL 报错 Too many connections、show processlist 里大量 Sleep 状态长连接;但日志里找不到明确泄露点。
- ThinkPHP 不会主动扫描「哪些连接该关却没关」
- 连接是否泄露,取决于你的代码是否显式调用了
close(),或是否在协程/长生命周期脚本中意外持有了Connection实例 - 配置项如
pool.size、pool.timeout控制的是连接复用池行为,不是泄露检测周期
真正能控制连接生命周期的是 pool.timeout 和 break_reconnect
这两个参数决定了连接在空闲多久后被主动丢弃,间接缓解「疑似泄露」问题——但它不是检测,而是兜底清理。
使用场景:高并发短请求(如 API)下,避免连接长期闲置占满池子;但对协程服务(如 Swoole)必须谨慎,因为连接可能跨请求复用。
本文共计1205个文字,预计阅读时间需要5分钟。
ThinkPHP的数据库连接池(基于`think\db\Connection`和底层PDO)是一种懒连接+复用+自动释放机制,它没有内置的连接泄露扫描器、活跃心跳探测或超时回收逻辑。所谓的连接泄露检测周期在官方代码中基本不存在——即使你配置了,也可能无效。
常见错误现象:max_connections 被耗尽、MySQL 报错 Too many connections、show processlist 里大量 Sleep 状态长连接;但日志里找不到明确泄露点。
- ThinkPHP 不会主动扫描「哪些连接该关却没关」
- 连接是否泄露,取决于你的代码是否显式调用了
close(),或是否在协程/长生命周期脚本中意外持有了Connection实例 - 配置项如
pool.size、pool.timeout控制的是连接复用池行为,不是泄露检测周期
真正能控制连接生命周期的是 pool.timeout 和 break_reconnect
这两个参数决定了连接在空闲多久后被主动丢弃,间接缓解「疑似泄露」问题——但它不是检测,而是兜底清理。
使用场景:高并发短请求(如 API)下,避免连接长期闲置占满池子;但对协程服务(如 Swoole)必须谨慎,因为连接可能跨请求复用。

