必须同步调整upload_max_filesize(如100M)、post_max_size(≥100M)和memory_limit(≥256M)三个PHP参数,并按SAPI类型重启对应服务(Apache或php8.2-fpm+nginx),同时Nginx需配置client_max_body_size,最后通过phpinfo()和$_FILES['error']实测验证。

要让 Ubuntu 系统中 PHP 8.2 支持更大的文件上传,不能只改一个参数——必须同步调整 PHP 层和 Web 服务器层的多个配置,缺一不可。
确认当前生效的 php.ini 路径
不同 SAPI(如 Apache、PHP-FPM、CLI)可能加载不同的 php.ini。先查清你实际用的是哪个:
- 终端运行:php --ini(查看 CLI 模式)
- 在 Web 环境中建一个
info.php,内容为<?php phpinfo(); ?>,访问后看 Loaded Configuration File 的路径 - 常见路径示例(按 Web 服务类型区分):
Apache:/etc/php/8.2/apache2/php.ini
Nginx + PHP-FPM:/etc/php/8.2/fpm/php.ini
CLI:/etc/php/8.2/cli/php.ini
修改 PHP 核心参数(三个必须同步)
打开对应 php.ini 文件,找到并修改以下三项(单位用 M 或 G,不加引号):
- upload_max_filesize = 100M(单个文件上限)
- post_max_size = 120M(整个 POST 请求体上限,需 ≥ upload_max_filesize)
- memory_limit = 256M(处理大文件时需足够内存,建议 ≥ post_max_size)
⚠️ 常见错误:只改 upload_max_filesize,而 post_max_size 还是默认的 8M,会导致 $_FILES 为空或报错 413。
立即学习“PHP免费学习笔记(深入)”;
重启对应的服务
改完 php.ini 后,必须重启对应服务才能生效:
- 如果用 Apache:
sudo systemctl restart apache2 - 如果用 Nginx + PHP-FPM:
sudo systemctl restart php8.2-fpm(必须)
sudo systemctl restart nginx(推荐一并重启) - 若在命令行测试(如
php upload_test.php),还需确认cli/php.ini也已同步修改
检查 Web 服务器层限制(关键补漏)
即使 PHP 配置正确,Nginx 或 Apache 也可能在请求到达 PHP 前就拦截:
-
Nginx:在
/etc/nginx/nginx.conf或站点配置的server或location块中添加:
client_max_body_size 120M; -
Apache(较少见,但启用 mod_security 时需注意):
检查日志是否出现ModSecurity: Access denied;临时禁用或调大SecRequestBodyLimit
改完 Nginx 配置后,执行 sudo nginx -t && sudo systemctl reload nginx 验证并重载。
验证是否真正生效
不要凭感觉,用实测确认:
- 访问
info.php页面,搜索三项参数,确认显示值是你刚设的数值 - 上传一个略大于原限制(如原为 2M,传 3MB 文件),观察
$_FILES['xxx']['error']:
值为 0 → 成功
值为 1 →upload_max_filesize超限
值为 2 → 表单中MAX_FILE_SIZE隐藏字段限制(前端问题)
值为 4 → 没选文件



















