PHP上传文件被截断需同步调大upload_max_filesize和post_max_size,且Nginx需设client_max_body_size、Apache设LimitRequestBody;还需检查max_execution_time、max_input_time、file_uploads、enctype及代理限制。

PHP 上传文件大小被截断,先看 upload_max_filesize 和 post_max_size
PHP 默认限制上传文件大小,不是前端限制了就真安全了,后端两个关键配置必须同时调大。常见现象是:选了 10MB 文件,$_FILES 为空,或 $_FILES['xxx']['error'] 返回 UPLOAD_ERR_INI_SIZE(值为 1)。
-
upload_max_filesize控制单个文件上限,比如设为20M -
post_max_size必须 ≥upload_max_filesize,因为整个 POST 请求体包含文件+表单字段,它卡在更外层;设成25M更稳妥 - 改完要重启 PHP-FPM 或 Apache/Nginx,光 reload 不生效
- 用
phpinfo()或ini_get('upload_max_filesize')确认实际生效值,别只信配置文件
超时导致上传中断,检查 max_execution_time 和 max_input_time
大文件上传慢,PHP 可能直接 kill 掉脚本,报错类似 Maximum execution time of 30 seconds exceeded,但实际是上传阶段就超时了。
-
max_execution_time影响脚本总运行时间,上传中也计入——设为300(5 分钟)较安全 -
max_input_time专管输入解析(含文件上传),单位秒,建议和max_execution_time一致或略大 - Nginx 下还要额外加
client_max_body_size,否则请求根本到不了 PHP 层,错误日志里会出现413 Request Entity Too Large - Apache 用户注意
LimitRequestBody指令,它也会拦截大请求
上传成功但 $_FILES 里 size 为 0 或 error=3(UPLOAD_ERR_PARTIAL)
这通常不是配置问题,而是传输过程被中断或客户端异常终止。但容易误判为 PHP 设置没生效。
- 检查浏览器控制台是否有网络失败、取消请求等记录
- 确认表单
enctype是"multipart/form-data",漏写或写错成application/x-www-form-urlencoded会导致文件不上传 - 某些代理或 CDN(如 Cloudflare)会限制上传大小或超时,绕过它们直连测试可快速定位
- PHP 的
file_uploads必须为On,虽然默认开启,但某些共享主机可能关掉
生产环境不能只改 php.ini,得配合前端校验和分片上传
单纯调大 PHP 限制只是让大文件“能传”,不代表“该传”或“传得稳”。用户上传 2GB 视频?PHP 进程扛不住,内存爆、超时、Nginx 杀连接都是大概率事件。
立即学习“PHP免费学习笔记(深入)”;
- 前端用
File.size做即时校验,避免用户选完才提示“太大” - 真正的大文件走分片上传(如 tus.io 协议或自研),后端只收小块,拼接后再处理
- 临时目录
upload_tmp_dir磁盘空间和权限也要检查,tmp分区满或www-data无写权限会导致上传静默失败 - CLI 模式下运行的脚本不受
php.ini上传限制影响,但 Web 请求永远受约束
最麻烦的是多层网关叠加限制:Nginx → PHP-FPM → 应用代码,每层都可能截断,得一层层查日志、打点验证,不能只盯着一个配置文件改。











