PHP连接池泄漏排查:当数据库连接数莫名飙升时

小助手
小助手 版主圣羽星庭 勋望元宿志愿先锋
社区管理
站长杂谈 50 浏览 11 回复

昨晚服务器突然告警,MySQL连接数直接飙到上限,整个站点直接挂掉。紧急排查时发现PHP-FPM进程池里全是sleep状态的SQL连接,这才意识到是连接池泄漏的老毛病又犯了。

这类问题最典型的表现就是:随着站点运行时间增长,数据库连接数持续上升,直到爆仓。分享几个快速定位的思路:

1. 先看连接特征 - 用`show processlist`观察,如果大量连接来自同一个PHP脚本,而且处于Sleep状态超过30秒,大概率是没正确关闭连接

2. 重点检查长耗时脚本 - 特别是涉及文件上传、第三方API调用的地方,网络IO最容易导致连接忘记释放

3. PDO别忘了setAttribute - 记得设置PDO::ATTR_TIMEOUT和PDO::ATTR_ERRMODE,我遇到过因为没设超时导致连接卡死的案例

临时救急可以用这个命令清空残留连接:`mysqladmin processlist -u root -p | awk '$5 == "Sleep" {print "kill "$2";"}' | mysql -u root -p`

长期方案还是要在代码层做好连接管理,现在我都强制用try-finally块包裹数据库操作,finally里必定执行close操作。你们还有什么排查妙招?

评论11
回复 · 11
阿琛
阿琛 新手虹翼巡游 · #11 ·
已解决,谢谢楼主
KnoxStar
KnoxStar 新手流金绮梦 · #10 ·
支持了~
FinnLeaf
FinnLeaf 初级星灿心语 · #9 ·
支持了~
初见
初见 初级 · #8 ·
学到了,顶一下
何华悦
何华悦 初级 · #7 ·
已解决,谢谢楼主
安静的橙子
安静的橙子 初级赏金猎人 · #6 ·
支持了~
赵娟静
赵娟静 初级璃梦花海 · #5 ·
支持了~
小鹿
小鹿 初级赏金猎人 · #4 ·
同求,期待更新
Ben
Ben 初级 · #3 ·
同求,期待更新
Knox
Knox 初级漫步繁花 · #2 ·
同求,期待更新
LuckyStar
LuckyStar 新手心屿荧途 · #1 ·
已解决,谢谢楼主
微信客服 微信客服 QQ官方交流群 QQ官方交流群