必须关闭的中间件有四个:think\middleware\LoadLangPack(引发磁盘I/O竞争)、SessionInit(无状态API无需会话)、CheckRequestCache(JSON接口无效且增CPU开销)、VerifyCsrfToken(RESTful API用Token认证,该中间件会误拦截请求)。

要让 ThinkPHP6 在 1 万并发下稳定运行,核心不是“加机器”或“调 PHP 参数”,而是精准裁剪中间件链——每多一个中间件,就多一次函数调用、一次对象实例化、一次潜在的 I/O 或数据库判断。TP6 默认中间件中,有多个在高并发 API 场景下属于冗余甚至有害组件。
哪些中间件必须关闭(非可选)
以下中间件在纯 API 服务、无 Session/多语言/模板渲染的场景中,应直接从全局中间件列表中移除:
- think\middleware\LoadLangPack:多语言包加载会遍历文件系统读取语言文件,高并发时引发大量磁盘 I/O 竞争;若接口不返回前端文案(如仅 JSON 数据),完全不需要。
- think\middleware\SessionInit:Session 初始化默认启用 file 驱动,每次请求都尝试读写 session 文件或 Redis key;API 接口应使用无状态 Token(JWT/Redis 认证),禁用后可节省 3–5ms/请求。
- think\middleware\CheckRequestCache:请求缓存依赖 Response 缓存头和 ETag 生成逻辑,对 JSON 接口基本无效,且校验过程引入额外 CPU 开销。
- think\middleware\VerifyCsrfToken:CSRF 保护只对表单提交有意义;RESTful API 使用 Authorization Header,该中间件不仅无用,还会拦截所有 POST/PUT/DELETE 请求。
如何安全关闭(三步实操)
关闭不是删代码,而是控制加载时机。推荐按以下顺序操作:
- 打开 app/middleware.php,将上述四项从全局中间件数组中彻底删除;保留必要项如
AllowCrossDomain(若需跨域)、TrustHosts(若反向代理部署)。 - 检查路由定义,确认没有在
Route::group()或单个路由上重复绑定这些中间件,例如:->middleware([LoadLangPack::class])必须清除。 - 验证是否生效:在任意控制器中临时加入
dump($this->app->middleware->get());,确认输出数组不再包含被移除的类名。
替代方案:按需启用,而非全局禁用
若部分接口仍需语言包或 Session(如后台管理页),不要恢复全局中间件,改用路由级绑定:
立即学习“PHP免费学习笔记(深入)”;
- 后台路由分组显式启用:
Route::group('admin', function () { /* ... */ })->middleware([LoadLangPack::class, SessionInit::class]); - API 路由分组保持空中间件:
Route::group('api', function () { /* ... */ })->middleware([]); - 登录接口等极少数需要 CSRF 的页面,单独加:
Route::post('login', 'LoginController@login')->middleware([VerifyCsrfToken::class]);
配套优化建议(直接影响万级并发表现)
中间件瘦身只是第一步,还需同步调整:
- 在 config/app.php 中设
'debug' => false,关闭 trace 日志与错误堆栈输出。 - 将
cache.driver切换为redis,避免 file 缓存锁竞争;确保route和config缓存已预热(运行php think route:import和php think clear:config)。 - 所有数据库查询强制走连接池或长连接配置,避免每次请求新建 PDO 实例。
- 静态资源(如 Swagger UI)交由 Nginx 直接托管,不经过 TP6 路由层。



















