本文介绍在 PHP 中通过 MySQL 会话变量 MAX_EXECUTION_TIME 为 SELECT 查询设置执行超时的正确方法,解决长时间全表扫描导致响应阻塞的问题。
本文介绍在 php 中通过 mysql 会话变量 `max_execution_time` 为 select 查询设置执行超时的正确方法,解决长时间全表扫描导致响应阻塞的问题。
在 PHP 应用中,当用户输入模糊搜索条件(如未加索引字段的 LIKE '%keyword%')时,MySQL 可能触发全表扫描,导致查询耗时数秒甚至更久,严重影响用户体验与服务可用性。虽然 MYSQLI_OPT_CONNECT_TIMEOUT 仅控制连接建立阶段的超时,而 max_statement_time(无 SESSION 修饰)并非标准 MySQL 变量名——真正生效的是 SET SESSION MAX_EXECUTION_TIME = N(单位:毫秒),且需在连接建立后、查询执行前显式设置。
✅ 正确做法如下:
<?php$conn = mysqli_connect("localhost", "username", "password", "database");if (!$conn) { die("Connection failed: " . mysqli_connect_error());}// ✅ 关键:设置当前会话的语句执行超时(单位:毫秒)// 例如:3000 毫秒 = 3 秒$conn->query('SET SESSION MAX_EXECUTION_TIME = 3000');// 后续所有 SELECT 查询将受此限制$result = $conn->query("SELECT COUNT(1) FROM `table` WHERE name LIKE '%abc%'");if (!$result) { // 超时时 MySQL 返回错误码 3024(ER_QUERY_TIMEOUT) if ($conn->errno == 3024) { echo "Query timed out after 3 seconds."; } else { echo "Query error: " . $conn->error; }} else { $count = $result->fetch_row()[0]; echo "Found $count records.";}?>
⚠️ 注意事项:
? 总结:SET SESSION MAX_EXECUTION_TIME 是最轻量、最直接的查询级超时控制方案。它无需修改 PHP 连接参数或引入第三方库,只需一行语句即可为高风险查询加上“安全熔断”,是构建健壮 Web 服务的重要实践。
立即学习“PHP免费学习笔记(深入)”;