移动端APP经PHP连接MySQL触发max_connections_per_hour错误求解决方案
解决方案:MySQL用户超出每小时连接数限制及代码优化
一、解决max_connections_per_hour限制的核心方案
- 调整MySQL用户资源配额:直接修改该数据库用户的每小时连接数上限,根据业务流量设置合理值,或者设为0解除限制。执行以下SQL命令(替换实际用户名和主机):
ALTER USER 'xxxxx'@'localhost' WITH MAX_CONNECTIONS_PER_HOUR 2000; -- 设为0表示无限制:ALTER USER 'xxxxx'@'localhost' WITH MAX_CONNECTIONS_PER_HOUR 0; - 使用数据库持久连接:将MySQLi连接改为持久连接,复用已有的数据库连接,减少新连接的创建次数。修改连接代码:
注意:持久连接需配合服务器配置(如php.ini的// 在主机名前加p:启用持久连接 $conn = new mysqli('p:' . DB_HOST, DB_USERNAME, DB_PASSWORD, DB_NAME);mysqli.allow_persistent开启),且不能在连接中保留会话状态(如未提交的事务)。 - 显式关闭数据库连接:在请求处理完成后主动关闭连接,避免闲置连接占用配额。在switch语句结束后添加:
$conn->close();
二、修复代码中的严重问题
你的代码存在语法错误、SQL注入风险等问题,需同步修复:
- 替换中文引号:代码中所有中文引号(如
“get name”、‘xy’z)替换为英文引号,否则会触发语法错误。 - 杜绝SQL注入:不能直接将用户输入的
$custid拼接到SQL语句中,必须使用预处理语句。以get name分支为例,修改后代码:case "get name": $sql = "INSERT INTO xxx (CustomerID, xyz) VALUES (?, ?)"; $stmt = $conn->prepare($sql); // 假设$custid是整数(i),第二个参数是字符串(s),根据实际类型调整 $stmt->bind_param("is", $custid, 'xyz'); $stmt->execute(); $stmt->close(); break; - 移除调试代码:生产环境中删除
echo $sql;,避免泄露敏感SQL信息。 - 优化错误处理:不要直接将数据库错误信息返回给客户端,改为记录日志并返回通用提示:
if ($conn->connect_error) { error_log("DB Connection failed: " . $conn->connect_error); die("Server error"); }
内容的提问来源于stack exchange,提问作者waleed.makarem
相关产品推荐
相关产品推荐

