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

PHP 文件上传大小限制不是单点配置,而是 php.ini 中多个参数协同生效的结果;改错一个或漏改一个,上传仍会失败。
为什么 upload_max_filesize 改了还是传不过 2MB?
这个值只控制单个文件上限,不决定实际能否上传成功。它必须同时满足三个条件:
-
upload_max_filesize(如20M)必须 ≥ 你要传的文件大小 -
post_max_size必须 ≥upload_max_filesize(因为文件走 POST 表单,整个请求体不能超限) -
memory_limit必须足够大,尤其当用move_uploaded_file()前做内容检查、图像处理等操作时
常见错误:把 upload_max_filesize 改成 50M,但 post_max_size 还是默认的 8M,结果上传直接返回空 $_FILES 或 413 错误。
如何确认当前生效的 PHP 配置?
别猜,直接看运行时实际加载的值:
php -i | grep -E "(upload_max_filesize|post_max_size|memory_limit)"
或者在 Web 环境中建一个 info.php:
<?php phpinfo(); ?>
重点查「Loaded Configuration File」路径,再打开对应 php.ini 编辑 —— 不是所有环境都用默认路径,Docker、MAMP、XAMPP、cPanel 各有各的位置。
修改后必须重启什么服务?
取决于你的 SAPI 类型:
- FPM(Nginx + PHP-FPM):改完
php.ini后执行sudo systemctl restart php*-fpm(如php8.1-fpm),不是只重启 Nginx - Apache mod_php:改完需
sudo systemctl restart apache2或httpd - CLI 模式(如用
php artisan storage:link上传测试):只需确保 CLI 的php.ini也同步修改(常和 Web 版本不同)
验证是否生效:上传一个略大于原限制的文件,观察 $_FILES['xxx']['error'] 值 —— 若为 1 是 upload_max_filesize 超限,2 是 MAX_FILE_SIZE 表单隐藏字段限制(前端设的,非 PHP 配置),4 才是没选文件;0 表示通过。
Nginx 或 Apache 还要额外配?
是的,Web 服务器层也有拦截:
- Nginx:必须加
client_max_body_size 50M;到http、server或location块,否则在到达 PHP 前就被 413 Request Entity Too Large 拦截 - Apache:若启用了
mod_security,它可能按规则拦截大 POST 请求;检查日志中是否有ModSecurity: Access denied,临时禁用或调大SecRequestBodyLimit
注意:Nginx 的 client_max_body_size 和 PHP 的 post_max_size 应保持一致或前者略大,否则 PHP 根本收不到请求。
最容易被忽略的是 FPM 的 request_terminate_timeout 和 request_slowlog_timeout —— 大文件上传耗时长,超时会导致连接中断,表现为上传进度卡在 99% 或直接断开,此时 error_log 里会出现 WARNING: [pool www] child ... exited on signal SIGTERM (15)。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











