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

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

昨晚服务器突然告警,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操作。你们还有什么排查妙招?

评论1
回复 · 1
LuckyStar
LuckyStar 新手赤羽栖云 · #1 ·
已解决,谢谢楼主
微信客服 微信客服