upload_max_filesize单独修改无效,必须同步调整post_max_size(≥upload_max_filesize)和memory_limit(≥128M),并重启Web服务;需通过phpinfo()确认生效路径,配置值须用M/G单位且无引号。

upload_max_filesize 设置后为什么上传还是失败
直接改 upload_max_filesize 通常不够,PHP 文件上传受三个关键配置共同限制,缺一不可。常见现象是:明明把 upload_max_filesize 改成 100M,但上传 20M 文件仍报错 UPLOAD_ERR_INI_SIZE。
-
upload_max_filesize控制单个文件最大大小(如50M) -
post_max_size必须 ≥upload_max_filesize,否则整个 POST 请求在解析前就被截断(如设为50M时,post_max_size至少也要50M,建议设为52M预留 header 空间) -
memory_limit要足够大,尤其用move_uploaded_file()前若做内容校验或图像处理,内存可能临时翻倍(如上传 50M 文件,memory_limit建议 ≥128M)
如何确认当前生效的 php.ini 路径和值
别猜配置在哪,也别改错文件。Web 环境下 phpinfo() 显示的 Loaded Configuration File 才是真实生效路径;CLI 下运行 php --ini 查看。
- 写一个临时文件
test.php,内容为,浏览器访问它,搜索 “upload_max_filesize” 和 “Loaded Configuration File” - 修改前先备份原
php.ini:cp /etc/php/8.1/apache2/php.ini /etc/php/8.1/apache2/php.ini.bak(路径按你实际输出调整) - 改完必须重启 Web 服务:Apache 用
sudo systemctl restart apache2,PHP-FPM + Nginx 则需sudo systemctl restart php8.1-fpm和sudo systemctl reload nginx
upload_max_filesize 的单位和格式陷阱
值必须带单位字母,且只支持 K、M、G(大小写敏感),不能写 mb、MB 或数字加引号。
- ✅ 正确:
upload_max_filesize = 128M、upload_max_filesize = 2G - ❌ 错误:
upload_max_filesize = "128M"(引号导致解析为字符串)、upload_max_filesize = 128MB(B会被忽略,实际变成 128 字节)、upload_max_filesize = 134217728(字节数虽合法但易出错,不推荐) - 注意:某些旧版 PHP 不支持
G,建议用M更稳妥(如2048M代替2G)
上传超限时的错误码和调试方法
前端看不到完整错误,得靠后端 $_FILES['xxx']['error'] 判断。最常见的是 UPLOAD_ERR_INI_SIZE(值为 1),说明被 upload_max_filesize 或 post_max_size 拦截。
- 在接收上传的 PHP 脚本开头加:
var_dump($_FILES); die();,检查error字段值 - 值为
1→ ini 配置超限;值为2→ 表单中MAX_FILE_SIZE隐藏字段限制(前端可控,非服务器限制);值为3→ 文件只有部分上传成功(网络中断等) - 日志里搜
PHP Warning: POST Content-Length of ... bytes exceeds the limit,这说明post_max_size是瓶颈,不是upload_max_filesize
改配置本身很简单,真正卡住人的永远是没意识到 post_max_size 和 memory_limit 的联动,以及改了却没重启对应服务。确认路径、改对位置、重启到位,三步缺一不可。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











