真正卡住上传的是PHP和Web服务器底层限制;需同步调大upload_max_filesize、post_max_size、client_max_body_size(Nginx)或LimitRequestBody(Apache),并重启服务,仅改其中一个无效。

真正卡住上传的不是 ThinkPHP,而是 PHP 和 Web 服务器底层限制;改完 upload_max_filesize 却仍报错“POST Content-Length exceeds the limit”,基本是因为漏调了 post_max_size 或 Nginx/Apache 的对应参数。
PHP.ini 里必须同步改的三个参数
ThinkPHP 只做上传后校验,它拿到的是 PHP 已解析过的 $_FILES。如果 PHP 根本没把文件传进来,框架连校验机会都没有。
-
upload_max_filesize = 20M:单个文件上限,按业务设,别盲目写 100M -
post_max_size = 25M:整个 POST 请求体上限,必须 ≥upload_max_filesize,建议多留 5M 给其他表单字段 -
memory_limit = 256M:至少是post_max_size的 1.5 倍,否则 PHP 解析大 POST 时直接内存溢出
改完必须重启 PHP-FPM(或 Apache/Nginx),仅 reload 不生效。用 phpinfo() 页面确认“Loaded Configuration File”路径,并核对页面上这三个值是否已更新。
Nginx 下必须加 client_max_body_size
哪怕 PHP 层全放开,Nginx 默认只允许 1MB 的请求体,超了直接返回 413 Request Entity Too Large,且不会进 PHP。
立即学习“PHP免费学习笔记(深入)”;
- 在 ThinkPHP 对应的
server或location块里加:client_max_body_size 25M; - 若用 FastCGI,检查
fastcgi_buffer_size和fastcgi_buffers是否足够(默认通常够,但传几百 MB 文件时可能需调) - 改完执行
nginx -t && systemctl reload nginx,别只 reload
Apache 下容易漏掉 LimitRequestBody
这个指令和 Nginx 的 client_max_body_size 功能一致,但默认不限制;一旦你在 .htaccess 或 VirtualHost 里设过,就可能意外拦截上传。
- 检查项目根目录下的
.htaccess和 Apache 虚拟主机配置,搜索LimitRequestBody - 如果存在且值太小(如
LimitRequestBody 1048576),改为LimitRequestBody 26214400(25M)或直接注释掉 - 改完执行
apachectl configtest && systemctl reload apache2
ThinkPHP 自身 upload 配置只是校验层
很多人在控制器里写 'maxSize' => 20 * 1024 * 1024 就以为能传 20M 文件——这是错的。该配置只在 PHP 成功接收文件后才起作用。
- 它不突破
upload_max_filesize,也不绕过post_max_size或 Web 服务器限制 - 它只影响 ThinkPHP 的验证逻辑,比如返回 “文件大小超出限制” 这类提示
- 如果你看到的是 PHP Warning(如 “POST Content-Length of XXX bytes exceeds the limit”),说明根本没到 ThinkPHP 这一层
最常被忽略的点是:Nginx/Apache 限制和 PHP 限制必须数值对齐,且 post_max_size 必须严格大于 upload_max_filesize——差 1 字节都可能因边界情况失败。



















