要查当前thinkphp应用的活跃数据库连接数,需直接查询mysql服务端:执行show processlist或select count(*) from information_schema.processlist where command != 'sleep',需数据库账号有process权限。

怎么查当前 ThinkPHP 应用的活跃数据库连接数
ThinkPHP 本身不暴露连接池或连接句柄的实时统计接口,Db::getConnect() 返回的是连接实例,不是连接池状态。真要看到“现在占用了几个连接”,得绕到 PDO 层或数据库服务端查。
推荐做法是直接查 MySQL 服务端:SHOW PROCESSLIST 或 SELECT COUNT(*) FROM information_schema.PROCESSLIST WHERE COMMAND != 'Sleep'。注意:这需要数据库账号有 PROCESS 权限。
- 在 ThinkPHP 中执行该 SQL 要加
->fetchSql(false)防止被日志或调试拦截 - 不要在高并发请求里频繁查
information_schema.PROCESSLIST,它会锁表、拖慢性能 - 本地开发可用 phpMyAdmin 或
mysql -u root -e "SHOW PROCESSLIST"快速验证
为什么 Db::connect() 多次调用不等于创建新连接
ThinkPHP 默认启用连接池(PDO 的 PDO::ATTR_PERSISTENT => true),只要 DSN、用户名、密码、端口完全一致,Db::connect() 拿到的是复用的底层 PDO 实例,不是新建 TCP 连接。
但有个关键例外:Db::connect('mysql2') 如果配置了独立的 hostname 或 port,就会触发新连接 —— 即使你没写 'persistent' => true,ThinkPHP 5.1+ 也会默认开启长连接。
- 检查是否意外定义了多个数据库配置(如
database.php里有mysql和mysql_slave),它们各自维护连接池 -
Db::close()只释放当前查询上下文,不关闭底层 PDO 连接(除非 PDO 自身超时或脚本结束) - 用
strace -e trace=connect php index.php可验证实际建连次数(Linux 环境)
max_connections 超了报错 “Too many connections” 怎么定位
这个错误一定来自 MySQL 服务端,不是 ThinkPHP 报的。说明已建立的连接数(含 Sleep 状态)达到 max_connections 限制值,新请求被拒。
ThinkPHP 日志里如果出现 PDOException: SQLSTATE[HY000] [1040] Too many connections,说明连接池失控或连接泄漏了。
- 先确认 MySQL 当前限制:
SELECT @@max_connections;再看已用:SHOW STATUS LIKE 'Threads_connected' - 检查是否有未关闭的事务或长查询卡住连接(
SHOW PROCESSLIST里Time值很大且State是Sending data或Locked) - ThinkPHP 的
transaction()如果没配try/catch+rollback(),可能让连接一直挂着不释放 - 别依赖
gc_collect_cycles()清理连接,PDO 连接不归 PHP GC 管
想监控连接占用趋势,该埋什么点
不能只看瞬时值。真正有用的监控是“连接数随时间变化 + 对应请求路径”,否则看不出是某个接口引发的泄漏。
最轻量的做法是在中间件里记录每次 Db::connect() 后的活跃连接数,并打点到日志或 Redis 计数器。但注意别在每次请求都查 information_schema。
- 用
pdo->getAttribute(PDO::ATTR_CONNECTION_STATUS)拿不到连接数,它只返回字符串描述,不可靠 - 推荐方案:在
app/middleware/DbMonitor.php里,用Db::getConnect()->getAttribute(PDO::ATTR_SERVER_INFO)辅助判断是否连上了,再配合定时采集Threads_connected - 生产环境建议用 Prometheus + mysqld_exporter,比代码埋点更稳定,也避免污染业务逻辑
连接资源不是越早释放越好,而是要在事务边界和查询生命周期内合理复用;但一旦出现 Too many connections,问题一定出在连接没在预期范围内释放,而不是 ThinkPHP 框架本身没提供监控 API。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











