upload_max_filesize生效需满足post_max_size≥其值且重启服务;nginx需同步调大client_max_body_size;上传失败应查$_files['error']具体码。

upload_max_filesize 设置不生效?先看它依赖 post_max_size
PHP 文件上传大小不是单靠 upload_max_filesize 决定的,它必须 ≤ post_max_size,否则直接 413 或空白页。比如设了 upload_max_filesize = 50M,但 post_max_size = 8M,那超过 8M 的 POST 请求(含文件+表单字段)根本进不了 PHP 解析阶段。
-
post_max_size必须 ≥upload_max_filesize,建议留 2–5M 余量(表单字段也占 POST 体积) - 两者都只接受数字+单位,如
64M、128M,不支持64 * 1024 * 1024这类算式 - 若用 Nginx,还要确认
client_max_body_size没卡在更小值——它比 PHP 层级更早拦截
php.ini 修改后没反应?确认你改的是对的那个文件
PHP 可能加载多个 php.ini:CLI 用一个,Web 用另一个;Apache 和 FPM 也可能不同。直接执行 php --ini 看 CLI 路径,而 Web 环境得靠 phpinfo() 输出里的 “Loaded Configuration File” 行。
- 常见错误:改了
/etc/php/8.1/cli/php.ini,但网站跑在 FPM 下,实际该改/etc/php/8.1/fpm/php.ini - 改完必须重启对应服务:
sudo systemctl restart php8.1-fpm(FPM)或sudo systemctl restart apache2(Apache) - 如果用 Docker,别改宿主机文件——得进容器改
/usr/local/etc/php/php.ini或挂载覆盖
max_execution_time 和 max_input_time 影响大文件上传吗?
影响很大,尤其上传慢速网络或大文件时。PHP 默认 max_execution_time = 30,但上传过程本身不计入执行时间;真正管上传耗时的是 max_input_time(单位秒),它控制整个请求(含上传)的解析超时。
-
max_input_time为 -1 表示不限制,但生产环境慎用;设为300(5 分钟)对百 MB 级上传更稳妥 -
max_execution_time在上传完成后才开始计时,主要防脚本处理卡死,和上传动作无关 - 注意:Nginx 的
fastcgi_read_timeout或 Apache 的Timeout也会中断长连接,需同步调大
上传成功但 $_FILES 为空?检查 error 值再排查
上传失败时 $_FILES['xxx']['error'] 不是 0,但很多人只打印 $_FILES 就放弃。真实错误码比“上传失败”有用得多:
立即学习“PHP免费学习笔记(深入)”;
-
UPLOAD_ERR_INI_SIZE (1)→upload_max_filesize超限 -
UPLOAD_ERR_FORM_SIZE (2)→ 表单里<input type="hidden" name="MAX_FILE_SIZE">值太小(前端限制,非 PHP 配置) -
UPLOAD_ERR_PARTIAL (3)→ 上传中断,常因post_max_size或网络问题 -
UPLOAD_ERR_NO_FILE (4)→ 用户根本没选文件,或name属性写错
务必在代码里加 var_dump($_FILES['xxx']['error']);,别靠猜。
真正麻烦的是多层代理或 CDN:它们可能静默截断大请求,此时 PHP 日志无报错,$_FILES 却为空——得查 Nginx access log 的状态码和响应体大小。











