upload_max_filesize 控制单个文件上传上限,post_max_size 控制整个 POST 请求体总大小;后者必须不小于前者,否则请求在解析阶段即失败,$_FILES 为空且报错 413 或 PHP Warning。

upload_max_filesize 和 post_max_size 到底谁管上传文件大小?
直接说结论:upload_max_filesize 控制单个上传文件的上限,post_max_size 控制整个 POST 请求体的总大小(含所有字段、文件、分隔符)。如果上传一个 500MB 的文件,post_max_size 至少得 ≥ 500MB,否则即使 upload_max_filesize 设为 2G,PHP 在解析请求时就直接报错,连 $_FILES 都不会生成。
常见错误现象:$_FILES 为空、$_POST 为空、error 字段为 0(注意:不是 1–8 的标准错误码,而是“没被 PHP 解析到”),日志里可能有 PHP Warning: POST Content-Length of XXX bytes exceeds the limit。
-
upload_max_filesize必须 ≤post_max_size,否则无效(PHP 启动时会警告) - 二者都只接受带单位的字符串,如
"2G"、"1024M",不支持"2048M"这种超出单位范围的写法(部分旧版本会静默截断) - 修改后必须重启 PHP-FPM 或 Apache,仅 reload 不生效(尤其在使用 opcache 且未清理时容易误判)
为什么改了 php.ini 还是上传失败?检查这三个地方
PHP 的配置加载顺序和运行模式常导致你以为改对了,其实没生效。最常踩的坑是:你改的是 CLI 模式的 php.ini,但 Web 服务用的是另一个。
- 用
phpinfo()页面确认「Loaded Configuration File」路径,而不是凭记忆或php --ini查 CLI 路径 - 检查是否被
.htaccess(Apache)或fastcgi_param PHP_VALUE(Nginx)覆盖,例如 Nginx 中写了fastcgi_param PHP_VALUE "upload_max_filesize=10M";,会强行覆盖 php.ini - 某些托管环境(如 cPanel、Plesk)或 Docker 镜像会通过
php_admin_value在 vhost 级别锁定参数,此时修改 php.ini 无效,需找对应控制面板入口或容器启动参数
超大文件上传不能只靠调大限制
把 upload_max_filesize 改成 4G 看似解决问题,实际会引发新瓶颈:内存耗尽、超时中断、客户端断连、Nginx/Apache 自身限制未同步调整。
立即学习“PHP免费学习笔记(深入)”;
- Nginx 需同步设
client_max_body_size 4G;,否则在 PHP 解析前就被拒绝,返回 413 错误 - Apache 需检查
LimitRequestBody(默认 0 表示无限制,但某些发行版会设为 512MB) -
max_execution_time和max_input_time必须延长(例如设为 3600),否则上传中途因脚本超时被 kill,$_FILES['xxx']['error']会是 0(非标准错误) - PHP 内存限制
memory_limit建议 ≥upload_max_filesize,否则 multipart 解析阶段就 OOM(尤其启用always_populate_raw_post_data或某些扩展时)
真正可靠的超大文件上传该怎么做?
纯靠 PHP 原生上传处理 GB 级文件,本质上是反模式。生产环境应避免让 PHP 承担完整接收+解析+存储链路。
- 前端用分片上传(如
web-uploader、uppy),后端只做分片接收、校验、合并,单次 POST 只传几 MB - 用 Nginx 的
upload_pass模块或nginx-upload-module直接落盘,PHP 只收元数据(绕过 PHP 的整个 POST 解析流程) - 云对象存储场景下,前端直传(如 OSS/MinIO Presigned URL),PHP 只生成凭证、校验回调,彻底不碰文件流
- 若必须走 PHP,至少用
fopen("php://input", "r")流式读取原始 body,配合$_SERVER['CONTENT_LENGTH']和边界解析,跳过$_FILES—— 但这要求完全自定义 multipart 解析逻辑,极易出错
真正卡住的往往不是 php.ini 参数,而是没意识到:上传超时的本质,是把网络 I/O、磁盘写入、PHP 解析耦合在同一个阻塞请求里。拆开它,问题才真正可控。



















