post_max_size必须严格大于upload_max_filesize,且二者需与memory_limit协同配置;若仅调大upload_max_filesize而post_max_size不足,php会在解析阶段丢弃整个请求,导致$_files为空、静默失败或413错误。

PHP 8.0 中,post_max_size 和 upload_max_filesize 不是独立生效的两个开关,而是存在明确的大小约束和流程依赖关系。改错一个或只调大其中一个,上传必然失败。
核心联动规则:post_max_size 必须严格大于 upload_max_filesize
这是因为:
-
upload_max_filesize控制单个上传文件的上限(例如50M) -
post_max_size控制整个 POST 请求体的总容量,包括所有文件 + 所有普通表单字段(如name、description)+ multipart 边界符与头部开销 - 即使只传一个文件,HTTP 协议封装后的实际请求体也比原始文件大几 KB 到几十 KB;多文件或带长文本字段时,差值更明显
- 所以
post_max_size至少要比upload_max_filesize大 2–5MB,推荐设为upload_max_filesize + 2M或更高(例如:前者 100M → 后者 102M 或 105M)
为什么 upload_max_filesize 单独调大没用?
常见现象:upload_max_filesize = 100M,但上传 80MB 文件仍失败,$_FILES 为空、$_POST 也为空,无错误码。
根本原因:当 POST 请求体整体超出 post_max_size(比如仍是默认的 8M),PHP 在解析请求阶段就直接丢弃全部数据,连 $_FILES 都不会生成 —— 这不是“上传失败”,而是“请求被截断”。此时错误日志通常显示 413 Request Entity Too Large 或静默失败。
单位与写法必须规范
在 php.ini 中配置时需注意:
- 单位统一用大写
M或G(如100M、2G),不加引号、不带空格、不写MB或GB(部分 PHP 版本会解析失败) - 数值与单位之间不能有空格(
100 M❌,100M✅) - 修改后必须重启 PHP-FPM 或 Web 服务器(如
systemctl restart php8.0-fpm或apache2),仅 reload 不生效 - 用
phpinfo()页面确认 “Loaded Configuration File” 路径,并核对 “Local Value” 是否已更新,不要只看配置文件内容
别漏掉 memory_limit 的隐性门槛
即使前两者都设对了,上传仍可能报 Allowed memory size exhausted:
- PHP 解析 multipart POST 数据时,会将边界信息、头字段等暂存内存,尤其在高并发或复杂表单下开销显著
-
memory_limit必须 ≥post_max_size,建议设为后者的 1.5–2 倍(例如post_max_size = 105M → memory_limit = 160M或256M) - 该限制属于
PHP_INI_SYSTEM级别,ini_set()无法运行时修改
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











