PHP 8.4 文件上传大小由 upload_max_filesize 和 post_max_size 共同决定,且需同步调大;还需调整 max_execution_time、max_input_time、memory_limit,并检查 Nginx 的 client_max_body_size。

PHP 8.4 上传文件大小限制不是单独由 PHP 版本决定的,而是由 php.ini 中几个关键配置项共同控制的。改对地方才能生效,改错一个就白调。
upload_max_filesize 和 post_max_size 必须同时调大
这两个值是硬性门槛:upload_max_filesize 控制单个文件上限,post_max_size 控制整个 POST 请求体总大小(含文件、表单字段等)。如果后者比前者小,哪怕文件本身没超,上传也会失败并静默卡在 $_FILES 为空或 error = 1(UPLOAD_ERR_INI_SIZE)。
-
upload_max_filesize必须设为你要支持的最大单文件尺寸,比如20M -
post_max_size至少要比upload_max_filesize大一点(建议 +2M),例如22M;它不能写成0或留空 - 两者单位必须一致(
M、G),且不支持小数,如1.5M是非法的,得写1536K或2M
max_execution_time 和 max_input_time 可能导致超时中断
大文件上传耗时长,如果 PHP 脚本执行时间或输入解析时间被掐断,会直接报 500 或返回空响应,$_FILES 看不到任何内容,错误日志里可能是 Maximum execution time of X seconds exceeded。
-
max_execution_time建议设为300(5 分钟)或更高,尤其用move_uploaded_file()写入慢盘时 -
max_input_time控制 POST 数据接收时限,也需同步调高,比如设为300;设为-1表示不限制(不推荐生产环境) - 注意:这些超时值对 CLI 模式无效,只影响 Web SAPI(如 FPM、Apache module)
memory_limit 不够会导致上传失败但报错隐蔽
PHP 在接收上传文件时,会把整个文件内容暂存进内存(除非启用了临时文件流机制),如果 memory_limit 不足,可能触发 Fatal error: Allowed memory size exhausted,或者更糟——静默失败、$_FILES 为空、无错误码。
立即学习“PHP免费学习笔记(深入)”;
- 建议将
memory_limit设为至少256M(上传 100MB 文件时,实际内存占用常达 1.5 倍) - 不要设为
-1,FPM 下可能导致 worker 进程被 OOM killer 杀掉 - 可通过
ini_get('memory_limit')在脚本开头验证是否生效
确认配置已加载且未被覆盖
PHP 8.4 支持多层配置(主 php.ini、conf.d/ 下文件、.htaccess、ini_set()),但上传相关参数仅在主配置中生效,运行时无法用 ini_set() 修改。
- 用
php --ini查看当前加载的配置路径 - 在 Web 环境中访问
phpinfo()页面,搜索upload_max_filesize,确认“Loaded Configuration File”路径和对应值 - 检查是否有多个
php.ini或.user.ini干扰;Nginx + FPM 场景下,确保修改的是 FPM pool 对应的php_admin_value配置,而非全局 Apache 的 - 改完必须重启 PHP 服务(
systemctl restart php8.4-fpm或service apache2 restart)
; 示例:php.ini 中应设置的关键段落 upload_max_filesize = 20M post_max_size = 22M max_execution_time = 300 max_input_time = 300 memory_limit = 256M
最常被忽略的一点:Nginx 自身也有 client_max_body_size 限制,即使 PHP 全放开,Nginx 会在请求到达 PHP 前就直接返回 413 Request Entity Too Large。别只盯着 php.ini。











