只改 memory_limit 不够,因为 phpMyAdmin 导出需同时满足 post_max_size(接收表单)、memory_limit(生成 SQL)和 max_execution_time(执行耗时)三重限制,缺一不可。

直接调大 memory_limit 能缓解,但必须同步调整 post_max_size 和 max_execution_time,否则导出仍会失败。
为什么只改 memory_limit 不够
phpMyAdmin 导出时,PHP 进程既要接收 POST 表单(含导出选项)、加载大量数据到内存、生成 SQL 字符串,还要完成 HTTP 响应。这三阶段分别受不同参数限制:
-
post_max_size必须 ≥ 导出页面提交的表单数据量(即使没上传文件,复杂导出选项也会撑大 POST 数据) -
memory_limit必须 ≥ 生成完整 SQL 字符串所需内存(尤其含 BLOB 字段或百万级 INSERT) -
max_execution_time必须 ≥ 导出耗时(大库可能需数分钟,而非默认 30 秒)
php.ini 中必须一起改的三个参数
在 php.ini 中定位并修改以下三项(注意单位大小写):
memory_limit = 512M post_max_size = 512M max_execution_time = 600
关键点:
立即学习“PHP免费学习笔记(深入)”;
-
post_max_size必须 ≥memory_limit,否则 PHP 在解析请求体时就报错“413 Request Entity Too Large” -
max_execution_time = 600是 10 分钟,对 GB 级导出较稳妥;设为0表示不限制(仅限 CLI 或可信环境) - 改完后必须重启 Web 服务器(如
systemctl restart nginx)和 PHP-FPM(systemctl restart php-fpm),光 reload 不生效
导出前临时绕过限制的代码方式
若无法修改 php.ini(如虚拟主机),可在 phpMyAdmin 的 export.php 开头插入:
ini_set('memory_limit', '512M');
ini_set('max_execution_time', '600');
但注意:
- 此方式仅对当前脚本有效,且前提是 PHP 没禁用
ini_set - 不能绕过
post_max_size—— 它在脚本执行前就被 Web 服务器拦截 - 部分托管环境会屏蔽该函数,此时必须走配置文件路径
容易被忽略的导出卡死真凶:结果集过大
即使内存参数调高,phpMyAdmin 仍可能因一次性渲染几十万行而卡死浏览器或超时。这时要改的是它的自身配置:
- 在
config.inc.php中设置$cfg['MaxRows'] = 5000;,限制每页最多显示行数 - 禁用自动统计:设
$cfg['ShowStats'] = false;,避免额外查询加重负担 - 导出时选「自定义」→ 取消勾选「包含列注释」「包含表注释」等非必要项,减小输出体积
真正的大库导出,别硬扛——用 mysqldump 命令行更稳,它不经过 PHP 内存池,也不受 Web 超时限制。



















