php上传大文件需同步调整upload_max_filesize、post_max_size、client_max_body_size、thinkphp的maxsize及超时参数,缺一不可。

PHP上传文件大小被截断:upload_max_filesize 和 post_max_size 必须同时调大
ThinkPHP 上传大文件失败,十有八九是 PHP 自身限制拦住了——不是框架问题,是 php.ini 里两个关键配置没配对。只改 upload_max_filesize 没用,因为整个 POST 请求体(含文件+表单字段)不能超过 post_max_size,后者默认常比前者还小。
实操建议:
-
upload_max_filesize控制单个文件上限,比如要传 200MB 视频,就设为200M -
post_max_size必须 ≥upload_max_filesize,还要预留一点空间给其他表单字段,建议设为205M或直接200M(两者相等也能过,但留点余量更稳) - 改完必须重启 PHP-FPM(不是 reload),否则不生效:
sudo systemctl restart php-fpm(路径按实际版本调整,如php8.1-fpm) - 验证是否生效:写个
phpinfo()页面,搜索这两个配置项,确认值已更新
Nginx 报 413 Request Entity Too Large:client_max_body_size 必须显式设置
即使 PHP 层放行了,Nginx 默认只允许 1MB 的请求体,超了直接返回 413 错误,连 PHP 都没机会处理。ThinkPHP 日志里看不到错误,浏览器 Network 面板却显示 413,就是这个原因。
实操建议:
- 在 Nginx 的 server 块或 location 块里加:
client_max_body_size 200M(数值和 PHP 的post_max_size对齐) - 不要只写在 http 块——ThinkPHP 通常走特定 location(如
location /或location ~ \.php$),必须确保该 location 生效 - 如果用了反向代理(比如前端套了 CDN 或 Nginx 负载均衡),上游代理也得同步改
client_max_body_size,否则卡在第一道网关 - 改完执行
sudo nginx -t && sudo systemctl reload nginx,注意是reload,不是 restart
ThinkPHP 自身的上传校验会二次拦截:maxSize 参数别漏设
PHP 和 Nginx 放行后,ThinkPHP 的 think\File 或 think\facade\Filesystem 还有一道校验。默认 maxSize 是 2MB,哪怕服务器允许 200MB,框架层也会先报错“上传文件超出允许大小”。
实操建议:
- 上传时显式传参:
$file->validate(['size' => 209715200])(单位字节,200MB = 209715200) - 或者全局配置(
config/filesystem.php或上传方法所在控制器)中设置:'maxSize' => 209715200 - 注意单位:ThinkPHP 5.x/6.x 的
maxSize是字节,不是M或MB字符串;填200 * 1024 * 1024更安全,避免歧义 - 如果用了分片上传(如
plupload、webuploader),单片大小也要对应控制,否则某一片超限照样失败
超时导致连接中断:PHP max_execution_time 和 Nginx fastcgi_read_timeout 都得延长
上传几百 MB 文件耗时长,PHP 脚本默认 30 秒超时,Nginx 等 PHP 响应的默认超时也才 60 秒。结果是文件传到一半,PHP 进程被杀,Nginx 返回 504 Gateway Timeout,前端看着进度条突然卡死或报错。
实操建议:
- PHP 层:在
php.ini中调大max_execution_time = 600(10 分钟),并确保max_input_time≥ 这个值(它控制输入解析时间,含文件上传) - Nginx 层:在 fastcgi_pass 所在 location 块加
fastcgi_read_timeout 600,否则 Nginx 在收到响应前就断开连接 - 如果用的是 Swoole 或 RoadRunner 等常驻内存模式,PHP 超时配置不生效,需单独配置其上传超时参数(如 Swoole 的
upload_max_filesize和request_timeout) - 测试时别只看成功,故意传个 300MB 文件,用
curl -v或浏览器 Network 面板观察状态码和响应头,确认全程无 504/413/502
最易忽略的是 Nginx 的 fastcgi_read_timeout —— 它和 PHP 的执行时间不是一回事,但缺一不可。很多人改了 PHP 却忘了 Nginx 这一层,上传卡在 60 秒整,怎么查都以为是代码问题。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











