ThinkPHP线上响应慢、CPU占用高,根本原因是调试模式未关闭导致缓存失效;必须关闭APP_DEBUG、禁用模板检测、启用路由缓存、切换Redis缓存驱动并卸载Trace面板。

ThinkPHP项目线上响应慢、CPU占用高,往往是因为调试模式开着同时缓存驱动还在低效运行——关掉调试模式才能让缓存驱动真正发力。
确认APP_DEBUG是否已关闭
先别急着改配置,直接验证当前生效值:在任意控制器里写一行 echo APP_DEBUG ? 'on' : 'off';,访问页面看输出。如果显示 on,说明调试模式仍在运行,所有缓存优化都白搭。
APP_DEBUG 是启动前就确定的常量,优先级为:环境变量 > .env > 入口文件 define > config/app.php。很多人只改了 config/app.php 却没动 .env 或入口文件,结果改了等于没改。
【必须删除 public/index.php 中 define('APP_DEBUG', true) 这行,或改为 false】,且该行必须位于 require __DIR__.'/../thinkphp/start.php'; 之前,否则无效。
立即学习“PHP免费学习笔记(深入)”;
改完后清空 runtime/ 目录下全部内容,否则旧缓存残留会干扰判断。
禁用模板重编译检查
调试模式关闭后,模板缓存才可能生效;但若 config/template.php 中仍开启模板检测,每次请求仍会扫描文件修改时间,彻底抵消缓存效果。
打开 config/template.php,找到 'tpl_cache_time' 配置项,设为 0 表示永久缓存(除非手动 clear);同时确保 'auto_read_ext' 和 'layout_on' 等关联设置不触发动态重载。
关键点:关闭调试模式后,【必须同步关闭 template.check_cache 参数】,否则系统仍会调用 filemtime() 检查每个模板文件,IO开销翻倍。
启用路由缓存
路由解析是ThinkPHP请求生命周期中IO最重的一环,尤其含大量注解路由时。未启用路由缓存,每次请求都要重新扫描 controller、解析 route.php、反射注解——这步无法被普通缓存驱动覆盖。
第一步:确认 app_debug === false 已生效(前面已验证);
第二步:在项目根目录执行 php think route:cache;
第三步:检查 runtime/route/route.php 是否生成成功,文件大小应大于 5KB(空缓存只有几百字节);
第四步:打开 config/route.php,将 'route_check_cache' 设为 true;
若命令报错,大概率是注解扫描路径不精确,检查 config/route.php 中 'annotation_paths' 是否只包含实际控制器目录,避免扫到 vendor 或测试文件夹。
切换缓存驱动为Redis
File 缓存驱动在并发场景下性能极差:多进程写同一缓存文件会触发 flock 等待,响应时间忽高忽低。哪怕调试模式已关,用 File 驱动也撑不起日均万级请求。
方法一:修改 config/cache.php,把 'default' 值从 'file' 改为 'redis';
方法二:确保 redis 扩展已安装,且 config/cache.php 中 'redis' 配置段 host、port、password 正确;
方法三:运行 php think cache:clear 清空旧缓存,再访问一次接口,观察 runtime/cache/ 下是否不再生成 .php 文件而是由 Redis 托管数据。
注意:若 Redis 连接失败,框架会静默降级回 file 驱动——务必在控制器里加 dump(cache()->getDriver()); 确认当前真实驱动类型。
关闭Trace调试面板
即使 APP_DEBUG = false,右下角仍可能出现灰色小面板,说明 trace 驱动未彻底卸载。它会额外加载 trace 类、写入 trace 日志文件,持续消耗磁盘IO。
打开 config/trace.php,将 'type' 改为 'none';
或直接删除 config/trace.php 文件(框架默认无此文件,存在即为自定义启用);
最后检查 public/static/ 目录下是否还有 trace.css / trace.js 文件,有则删掉——这些静态资源会被自动注入,哪怕后端已禁用。



















