phpMyAdmin本身不控制MySQL查询超时,$cfg['ExecTimeLimit']仅限制其前端脚本执行时间,与MySQL的max_execution_time(仅SELECT生效、会话级)无关;真正超时由MySQL服务端触发并返回错误码1969。

phpMyAdmin 本身不控制 MySQL 查询超时
你不能在 phpMyAdmin 的界面或 config.inc.php 里为「每个 MySQL 实例」单独设置 max_execution_time。这个值是 MySQL 服务端的会话级配置,由 PHP 连接建立后发送 SET 命令控制,phpMyAdmin 只是前端触发者,不参与超时策略分发。
常见误解是改 $cfg['ExecTimeLimit'] 就能限制 SELECT 耗时——它只影响 phpMyAdmin 自身的脚本执行时间(比如解析大结果集、生成 HTML),和 MySQL 执行 SQL 的耗时无关。
真正生效的超时控制链是:
phpMyAdmin → PHP PDO/MySQLi 连接 → MySQL server 的 max_execution_time(仅 SELECT)→ 超时后返回错误码 1969。
为不同实例分别设置 max_execution_time 的实操路径
phpMyAdmin 每次连接一个 MySQL 实例时,会新建一个 PHP 进程+MySQL 连接。你可以在连接建立后、执行 SQL 前,用 SET SESSION max_execution_time = N 显式覆盖该连接的阈值。
立即学习“PHP免费学习笔记(深入)”;
- 修改
config.inc.php,在每个$cfg['Servers'][$i]块末尾加一行:$cfg['Servers'][$i]['extension'] = 'mysqli';(确保用 mysqli,PDO 不保证会话变量可靠传递) - 在 phpMyAdmin 安装目录下创建
libraries/vendor_config.php(若不存在),写入:
$GLOBALS['cfg']['Servers'][$i]['connect_options'] = [
'init_commands' => [
"SET SESSION max_execution_time = 120000"
]
];
注意:$i 需替换为对应服务器索引(如 1、2、3),且该数组必须按服务器编号逐个定义,不能统一写死;init_commands 是 phpMyAdmin 7.0+ 支持的连接初始化指令,旧版需打补丁或改源码。
更稳妥的做法是:登录后,在 SQL 标签页手动执行一次 SET SESSION max_execution_time = 120000,再运行长查询——只要不切换数据库或刷新页面,该会话持续有效。
安装、修复、更新或打包一个基于 Python 和 PyMySQL 实现的 Windows `mysql` 命令。适用于用户希望在 PowerShell/CMD 中输入 `mysql` 时重定向到 Python 实现、需要交互式输入 MySQL 连接信息、需要同步到当前用户本地 bin 目录,或需要将该能力封装成可公开复用的 Codex skill。
为什么不能靠 Nginx 或 PHP-FPM 调整来解决?
Nginx 的 fastcgi_read_timeout 和 PHP-FPM 的 request_terminate_timeout 控制的是「PHP 脚本整体生命周期」,不是单条 SQL。它们一超时就直接返回 504 或 502,MySQL 线程可能还在跑,造成资源残留。
典型误配现象:
- 把
fastcgi_read_timeout设成 600,但 MySQL 的max_execution_time是 30 —— 用户看到的是 504,实际错误是 1969,排查方向全错 - 调高 PHP 的
max_execution_time(php.ini)—— 它只管 PHP 代码执行,对 mysqli_query() 内部等待 MySQL 返回的过程无效 - 在 Nginx location 里加
proxy_read_timeout—— phpMyAdmin 不走 proxy_pass,这个配置根本不起作用
正确顺序是:先确认 MySQL 层是否真超时(查 SHOW PROCESSLIST 看 State 是否为 Killed),再决定调哪个参数。
容易被忽略的权限与兼容性细节
设置 max_execution_time 需要当前 MySQL 用户有 SUPER 权限才能 SET GLOBAL,但 SET SESSION 任何用户都能执行——所以不要在 config 中硬写 SET GLOBAL,那会导致所有实例共用一个值,且权限失败时整个 phpMyAdmin 启动报错。
另一个关键点:MySQL 5.7+ 才支持该变量,5.6 及更早版本完全无视。如果你管理的多实例中混有老版本,必须单独识别并跳过设置,否则连接直接失败。
最后提醒:跨实例配置差异越大,越要避免用 init_commands 统一注入。例如测试库允许 300 秒,生产库只许 10 秒,就必须为每个 $cfg['Servers'][$i] 单独定义不同的 init_commands 数组,漏掉一个就等于没配。


















