MySQL 连接数达上限导致“Too many connections”错误,需检查Threads_connected与max_connections值,PHP层避免长连接和连接泄漏,MySQL侧调整max_connections并优化timeout参数。

PHP 连接 MySQL 提示 “Too many connections” 怎么办
不是 PHP 代码写错了,是 MySQL 服务端拒绝新连接——max_connections 被打满了。PHP 的 mysqli_connect() 或 PDO::__construct() 报错时显示的 Too many connections,根源在 MySQL 配置,而非 PHP 本身。
怎么查当前 MySQL 连接数和上限
登录 MySQL 后执行这两条命令就能快速定位:
SHOW VARIABLES LIKE 'max_connections';
SHOW STATUS LIKE 'Threads_connected';
Threads_connected 是当前活跃连接数,接近或等于 max_connections 值就说明真被卡住了。注意:这个值不包含已关闭但尚未回收的连接(如未显式调用 mysqli_close() 或脚本结束前异常退出),所以实际压测时可能更高。
PHP 层能做的关键控制点
PHP 不控制最大连接数,但可以避免无谓占用:
ECTouch是上海商创网络科技有限公司推出的一套基于 PHP 和 MySQL 数据库构建的开源且易于使用的移动商城网店系统!应用于各种服务器平台的高效、快速和易于管理的网店解决方案,采用稳定的MVC框架开发,完美对接ecshop系统与模板堂众多模板,为中小企业提供最佳的移动电商解决方案。ECTouch程序源代码完全无加密。安装时只需将已集成的文件夹放进指定位置,通过浏览器访问一键安装,无需对已有
立即学习“PHP免费学习笔记(深入)”;
- 不用长连接就别开:
mysqli_connect()第五个参数传false(默认就是短连接),避免连接被复用后滞留 - 用完立刻关:
mysqli_close($conn)或让脚本自然结束——但注意 CLI 模式下连接不会自动释放,必须显式关闭 - PDO 构造时不加
PDO::ATTR_PERSISTENT => true,否则会进连接池,加剧堆积 - Web 场景慎用连接池中间件(如 ProxySQL)+ 持久连接组合,容易在高并发时把
max_connections打穿
MySQL 侧必须调的配置项
仅靠 PHP 优化不够,得调 MySQL 的硬限制:
- 临时调高(重启失效):
SET GLOBAL max_connections = 500; - 永久生效:修改
my.cnf(Linux)或my.ini(Windows)的[mysqld]段,加一行:max_connections = 500,然后重启 MySQL - 注意内存代价:每个连接约占用 256KB~1MB 内存,设太高可能触发 OOM,需结合
innodb_buffer_pool_size综合评估 - 配合检查
wait_timeout和interactive_timeout(默认 28800 秒),缩短空闲连接存活时间,防止连接“挂尸”
真正难排查的是连接泄漏:某段代码反复 new PDO() 却没释放,或异常跳过 close(),这类问题不会立刻暴露,压测半天才崩。建议在开发期就用 SHOW PROCESSLIST 定期抓快照比对。










