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 控制整个 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
大文件上传耗时长,如果 PHP 脚本执行时间或输入解析时间被掐断,会直接报 500 或返回空响应,$_FILES 看不到任何内容,错误日志里可能是 Maximum execution time of X seconds exceeded。
max_execution_time 建议设为 300(5 分钟)或更高,尤其用 move_uploaded_file() 写入慢盘时max_input_time 控制 POST 数据接收时限,也需同步调高,比如设为 300;设为 -1 表示不限制(不推荐生产环境)PHP 在接收上传文件时,会把整个文件内容暂存进内存(除非启用了临时文件流机制),如果 memory_limit 不足,可能触发 Fatal error: Allowed memory size exhausted,或者更糟——静默失败、$_FILES 为空、无错误码。
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 查看当前加载的配置路径phpinfo() 页面,搜索 upload_max_filesize,确认“Loaded Configuration File”路径和对应值php.ini 或 .user.ini 干扰;Nginx + FPM 场景下,确保修改的是 FPM pool 对应的 php_admin_value 配置,而非全局 Apache 的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。