upload_max_filesize不生效的主因是post_max_size未同步调大且须≥前者,还需检查Nginx的client_max_body_size、PHP超时参数及表单enctype等配置。
upload_max_filesize 设置不生效?先看它和 post_max_size 的关系
upload_max_filesize 控制单个上传文件大小,但它不是独立起作用的。php 实际接收请求时,会先经过 post_max_size 这道关——这个值必须大于等于 upload_max_filesize,否则哪怕文件没超 upload_max_filesize,也会被直接截断,报错 “post content-length of xxx bytes exceeds the limit of yyy bytes”。
- 修改
php.ini时,两个参数都要设,例如:upload_max_filesize = 64M<br>post_max_size = 72M
-
post_max_size要比upload_max_filesize大一点,因为 POST 数据里还包含其他字段(如表单文本、多个文件名等),留点余量更稳 - 如果用的是 Nginx,还得同步检查
client_max_body_size,它默认是 1M,不改的话 PHP 层设置再大也没用
改完 php.ini 没反应?确认你改的是正在运行的配置文件
PHP 可能加载多个 php.ini 文件(比如 CLI 和 Web SAPI 各用一份),或者被某些环境覆盖(如 Docker 容器里挂载了别的配置、cPanel 自动管理配置)。直接改错文件,等于白干。
- 运行
php --ini查 CLI 加载路径;在 Web 页面中调用phpinfo(),搜索 “Loaded Configuration File”,看实际生效的是哪个文件 - 改完后必须重启服务:Apache 要
sudo systemctl restart apache2,Nginx + PHP-FPM 则要sudo systemctl restart php-fpm(版本不同可能是php7.4-fpm或php8.2-fpm) - 不要只改
/etc/php/<em>/cli/php.ini</em>,Web 请求走的是/etc/php//fpm/php.ini或/etc/php/*/apache2/php.ini
上传大文件失败但没报错?检查 max_execution_time 和 max_input_time
文件上传本身耗时,PHP 默认的 max_execution_time = 30 和 max_input_time = 60 很容易在上传中途触发超时,导致连接中断、前端卡住、后端日志里只有 "PHP Warning: Unknown: Input variables exceeded 1000" 这类模糊提示。
- 对于百兆级文件,建议设为:
max_execution_time = 300<br>max_input_time = 300
-
max_input_time特别关键:它限制整个请求数据(包括上传)的解析时间,不是只算脚本执行 - 如果用的是 PHP-FPM,还要留意
request_terminate_timeout(FPM 配置项),它可能比 PHP 内部超时更早杀掉进程
上传成功但 $_FILES 为空?确认 enctype 和表单写法没出错
即使所有 PHP 限制都放开,前端表单写错一个字母,$_FILES 就永远是空数组,且不会报任何 PHP 错误,非常隐蔽。
- 表单必须带
enctype="multipart/form-data",漏掉或拼错(比如写成mutlipart/form-data)都会失效 -
<input type="file">必须有name属性,且和服务端读取的键名一致,例如<input name="avatar">对应$_FILES['avatar'] - 不要用 JavaScript 直接
new FormData().append()后忘记设置contentType: false和processData: false,否则 jQuery 或 fetch 会强行序列化二进制内容
改 php.ini 是必要步骤,但真正卡住人的,往往是 Nginx 的 client_max_body_size、FPM 的超时配置、或者表单里一个拼错的 enctype。这些地方不逐个对齐,光调 PHP 参数毫无意义。
立即学习“PHP免费学习笔记(深入)”;



















