PHP上传限制必须修改对应版本的php.ini文件并重启PHP服务,同时确保upload_max_filesize与post_max_size匹配且Nginx的client_max_body_size同步调整。

PHP 上传限制在哪改:直接改 php.ini 才生效
宝塔面板里点来点去改的「PHP 设置」页面,只是个快捷入口,背后还是操作 php.ini 文件。如果你只在面板里调了「最大上传文件大小」和「最大 POST 数据大小」,但没重启 PHP,或者改的是错误版本的配置文件(比如改了 PHP 7.4 的配置,实际网站用的是 PHP 8.1),那就完全没用。
- 先确认当前站点用的 PHP 版本:
php -v或在宝塔「网站」→「设置」→「PHP 版本」里看 - 对应版本的
php.ini路径通常在:/www/server/php/{版本号}/etc/php.ini(例如/www/server/php/81/etc/php.ini) - 必须改这个文件,而不是面板里显示的「其他配置」或「自定义 php.ini」(后者不参与核心上传逻辑)
- 改完一定要执行:
service php-fpm-{版本号} restart(如service php-fpm-81 restart),光「重载配置」不够
upload_max_filesize 和 post_max_size 必须同时调,且有大小关系
这两个值不是独立起作用的。upload_max_filesize 控制单个文件上限,post_max_size 控制整个 POST 请求体总大小(含所有字段+文件)。如果上传一个 50MB 的文件,但 post_max_size = 20M,PHP 直接拒绝解析请求,连错误都不报,浏览器可能卡在 loading 或返回 500。
-
post_max_size必须 ≥upload_max_filesize,建议留 2–5MB 余量(比如设upload_max_filesize = 100M,则post_max_size = 105M) - 别写成
100MB—— PHP 只认M(兆字节),MB会被当成 0,等同于禁用上传 - 常见错误值:
upload_max_filesize = 0(禁用)、= 2G(超大值需配合系统级限制,不推荐) - 改完可用
php -i | grep -E 'upload_max_filesize|post_max_size'快速验证是否生效
宝塔「网站」设置里的「PHP 配置」是障眼法,慎点「一键修改」
面板里「网站」→「设置」→「PHP 配置」页有个「上传限制」滑块,它确实会写入 php.ini,但只改你当前选中的 PHP 版本,且不会校验 post_max_size 是否同步。更麻烦的是:如果该站点启用了「防跨站攻击(open_basedir)」,而上传临时目录(upload_tmp_dir)不在允许路径内,即使大小调对了,也会报 move_uploaded_file(): Unable to move 错误。
- 检查
upload_tmp_dir是否被覆盖:默认是/tmp,但有些面板会改成/www/wwwroot/xxx/tmp,得确保该目录存在、可写、且在open_basedir白名单里 - 不要依赖「一键修改」—— 它不处理
max_execution_time和max_input_time,大文件上传超时就直接 502 - 如果上传卡住几秒后报 502,大概率是
max_execution_time太小(建议 ≥ 300),或 Nginx 的client_max_body_size没同步调(见下一条)
Nginx 层的 client_max_body_size 是第一道关卡
PHP 还没启动,Nginx 就可能把大请求拦在门外。宝塔里「网站」→「设置」→「配置文件」里能看到 client_max_body_size,但它默认只写在 server 块里,如果站点用了反向代理或 SSL,实际生效的可能是 http 块或 location 块里的值。
立即学习“PHP免费学习笔记(深入)”;
- 最稳妥是在「网站」→「配置文件」中找到
server { ... }区域,在location ~ \.php$ { ... }里面加一行:client_max_body_size 100M; - 别只改全局 http 块——那会影响所有站点;也别只改 server 块——某些 rewrite 规则会跳过它
- 改完必须执行:
nginx -t && systemctl reload nginx,否则配置不加载 - 如果用的是宝塔的「SSL」选项,记得在 SSL 配置块里也补上这一行,否则 HTTPS 下上传照样失败
真正麻烦的从来不是改哪几行,而是改完之后不知道哪个环节卡住了。查错顺序应该是:Nginx error.log → PHP error.log → phpinfo() 页面确认参数值 → 用 curl -X POST 模拟上传看响应头。漏掉任意一层,都可能让你在 php.ini 里反复横跳。



















