phpEnv环境下解决数据库连接过多的Error 1040

酷萱姑娘_3802

酷萱姑娘_3802

2026-04-28

742人浏览

原创

php连接数爆满主因是mysql_connect废弃、未显式关闭mysqli连接、持久连接未启用及wait_timeout过长,需改用mysqli/pdo、启用p:前缀持久连接、调低超时值并用try/finally或shutdown函数确保释放。

phpenv环境下解决数据库连接过多的error 1040

phpEnv 里 mysql_connect 复用失败导致连接数爆满

phpEnv 默认用的是 MySQLi(非 PDO)且多数配置未启用持久连接,每次 mysql_connect(或 mysqli_connect)都会新建 TCP 连接,脚本结束却不保证释放——尤其在 FastCGI 模式下,PHP 进程常驻,连接堆积极快。错误 Too many connections(Error 1040)本质是 mysqld 的 max_connections 被耗尽,而非 PHP 层崩溃。

实操建议:

  • 立即停用所有 mysql_connect(已废弃),统一改用 mysqli 或 PDO,并显式调用 mysqli_close($conn) 或让对象自动析构(但需确认脚本生命周期)
  • 检查 phpEnv 自带的 php.ini,确认 mysqli.allow_persistent = On,并在连接时用 new mysqli('p:127.0.0.1', ...)(注意开头的 p: 前缀)启用持久连接
  • 避免在循环内反复调用连接函数;把 $mysqli 实例作为单例或请求级共享,而不是每次 require 都 new 一个

phpEnv 的 MySQL 配置中 wait_timeout 和 interactive_timeout 过长

phpEnv 封装的 MySQL 服务往往沿用默认配置,wait_timeout 默认是 28800 秒(8 小时),意味着空闲连接会挂起很久才被服务端断开。而 PHP-FPM 子进程复用时,旧连接可能仍处于“Sleep”状态却无法重用,最终占坑不干活。

解决方法:

btpanel phpsite 宝塔面板PHP网站
btpanel phpsite 宝塔面板PHP网站

宝塔面板 PHP 网站管理:站点创建、删除、启停、PHP 版本切换、域名管理、SSL证书管理、伪静态管理、数据库管理

下载
  • 进 phpEnv 控制面板 → MySQL → 配置文件(通常是 my.ini 或 my.cnf),在 [mysqld] 段落添加或修改:
    wait_timeout = 60<br>interactive_timeout = 60
  • 重启 MySQL 服务(不是仅 reload)才能生效
  • 顺便检查 max_connections 是否合理:phpEnv 通常配为 100~200,若并发请求多于该值,需同步调高,但更推荐先压降连接数而非盲目扩容

PHP 脚本里没捕获异常就提前 exit,导致 mysqli 连接未关闭

常见于调试阶段加了 exit('debug'); 或未包裹 try/catch 的查询逻辑。一旦在 mysqli_query 后、mysqli_close 前中断,连接资源不会自动回收——特别是使用面向对象风格时,析构函数未必及时触发。

稳妥做法:

  • 用 register_shutdown_function 注册清理回调,例如:
    register_shutdown_function(function() use ($mysqli) {<br>    if ($mysqli && $mysqli->ping() === false) {<br>        $mysqli->close();<br>    }<br>});
  • 对关键连接使用 try/finally,确保无论是否异常都 close:
    try {<br>    $mysqli = new mysqli(...);<br>    $mysqli->query("SELECT ...");<br>} finally {<br>    $mysqli?->close();<br>}
  • 禁用 mysql.trace_mode(若开启),它会在错误时额外维持连接用于堆栈追踪

phpEnv 中 Apache + PHP-FPM 混合模式下的连接泄漏叠加

部分 phpEnv 版本默认启用了 Apache 的 mod_php 和 PHP-FPM 双运行模式,而两套机制对连接池的管理逻辑不同:mod_php 进程生命周期长,FPM 则按 request 分配。若代码同时被两种 SAPI 加载,同一请求可能无意中建立两套连接。

验证与修复:

  • 在脚本开头加 echo PHP_SAPI;,确认当前是 fpm-fcgi 还是 apache2handler;只保留其中一种,推荐统一用 FPM(phpEnv 控制面板可切换)
  • 检查 Apache 的 httpd.conf 是否加载了 mod_php(如 LoadModule php_module),注释掉并重启 Apache
  • FPM 的 pm.max_children 应 ≤ MySQL 的 max_connections × 0.8,留出系统和监控连接余量
实际排查时,先用 mysql -u root -p -e "SHOW PROCESSLIST;" 看哪些连接状态是 Sleep 且时间超长;再结合 PHP 错误日志里的 Warning: mysqli::__construct(): (HY000/1040) 定位具体脚本。连接数问题从来不是单点故障,而是连接生命周期管理松散在多个环节的叠加暴露。

php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

phpenv php

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2023.09.01

10944

6

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

6381

5

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

2155

5

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

2023.10.23

4028

4

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

2023.10.23

4734

6

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.03

3711

9

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.09

5337

8

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.13

4182

8

sprintf函数用法详解
sprintf函数用法详解

sprintf函数的用法:1、格式化字符串;2、指定输出宽度和精度;3、返回值。更多关于sprintf函数用法详解的内容,大家可以阅读下面的文章。

2023.11.27

12062

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
使用phpenv集成环境安装极致CMS
使用phpenv集成环境安装极致CMS

共2课时 | 297人学习

phpEnv手册
phpEnv手册

共0课时 | 0人学习