
post_max_size 和 upload_max_filesize 必须同时调大
PHP 文件上传失败,常见报错是 UPLOAD_ERR_INI_SIZE(错误码 1),根本原因不是单个配置项没改对,而是 post_max_size 和 upload_max_filesize 存在隐式约束关系:前者必须 ≥ 后者,否则即使 upload_max_filesize 设为 100M,只要 post_max_size 还是默认的 8M,上传照样被截断。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
-
upload_max_filesize控制单个文件上限,比如设为50M -
post_max_size控制整个 POST 请求体总大小,需至少比upload_max_filesize大(例如设为52M),因为还要包含表单字段、边界符等额外开销 - 若启用多文件上传(
<input type="file" multiple>),post_max_size更要留足余量
修改位置优先级:php.ini > .htaccess > ini_set()
ini_set() 在运行时无法修改 post_max_size 和 upload_max_filesize,这两个指令属于 PHP_INI_PERDIR 级别,只允许在 php.ini、.htaccess(Apache)或虚拟主机配置中生效。试图用 ini_set('post_max_size', '50M') 不会报错,但完全无效。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 生产环境一律改
php.ini,改完必须重启 PHP-FPM 或 Web 服务器(如systemctl restart php-fpm) - 共享主机可用
.htaccess(仅 Apache):php_value upload_max_filesize 50M<br>php_value post_max_size 52M
- 用
phpinfo()页面确认最终生效值,别只看配置文件
注意 memory_limit 的隐性影响
即使 post_max_size 和 upload_max_filesize 都调大了,上传大文件仍可能失败,错误日志里出现 Allowed memory size exhausted。这是因为 PHP 默认把上传文件先读进内存再写临时文件,memory_limit 必须 ≥ post_max_size,否则解析 POST 数据阶段就崩了。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 设
memory_limit至少比post_max_size大 20%,例如post_max_size = 52M→memory_limit = 64M - 如果用
move_uploaded_file()处理大文件,PHP 实际内存占用远低于文件大小,但解析 multipart/form-data 边界和头信息仍需额外缓冲空间 - 避免设
memory_limit = -1(无限制),这在生产环境极不安全
验证是否真正生效的三步检查法
改完配置后不能只信“我改过了”,必须逐层验证。很多问题出在 Nginx、PHP-FPM 或应用层中间件拦截了大请求,而非 PHP 自身。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 第一步:访问
phpinfo()页面,搜索upload_max_filesize、post_max_size、memory_limit,确认显示值是你设的 - 第二步:检查 Web 服务器限制 —— Nginx 要配
client_max_body_size(单位 M),Apache 要配LimitRequestBody - 第三步:用
var_dump($_FILES)+error_get_last()查看实际上传结果,不要只依赖前端提示
client_max_body_size 和 PHP 的 post_max_size 是两道独立关卡,漏掉任意一个,上传都会静默失败。











