根本原因是多种缓存未彻底关闭:模板缓存需设config/template.php中'cache' => false;HTML静态缓存需设'html_cache_on' => false并删runtime/html/;配置缓存需设'config_cache' => false并删runtime/cache/config.php;路由缓存需设'route_check_cache' => false并删runtime/route/route.php;数据库字段缓存需设'fields_cache' => false或调用Db::clearCache();最后执行php think clear --all清空全部runtime缓存。

ThinkPHP6开发环境模板总不更新、路由404、数据库字段新加了却读不到,根本原因是缓存没关干净——默认开启的模板缓存、HTML静态缓存、配置缓存、路由缓存、数据库字段缓存全部在后台偷偷运行,改完代码刷新页面还是旧的。
彻底关闭模板缓存
模板缓存是开发时最常踩坑的一环,它把模板编译成PHP文件存在runtime/view/下,改了.html却没变,就是它在作怪。
打开config/template.php,找到'cache' => true这一行,改为'cache' => false。
【必须设为布尔false,不能写字符串'false'或数字0】
立即学习“PHP免费学习笔记(深入)”;
这一步做完,框架将不再生成任何runtime/view/下的PHP缓存文件,每次请求都重新解析模板源码。
如果项目用了自定义模板引擎驱动,还需确认driver配置中没有覆盖cache选项——比如File驱动里写了'realpath'=>true但漏了'cache'=>false,依然会生效。
禁用HTML静态缓存
很多人以为清了runtime/view就万事大吉,结果发现带参数的URL能刷新、不带参数的URL还是旧的,这就是HTML静态缓存拦截了请求,压根没走到模板层。
在config/app.php中,添加或修改配置项:'html_cache_on' => false。
更稳妥的做法是按环境区分:用'html_cache_on' => app()->isDebug(),调试模式下自动关闭,上线后由部署脚本控制。
别忘了手动删掉runtime/html/目录——这个目录和view/并列,php think clear默认不清理它。
关闭配置缓存
配置读取慢、config()返回旧值,往往是因为APP_DEBUG=true时optimize:config被跳过,每次请求都重复include一堆config/*.php文件。
第一步:确保.env或config/app.php中APP_DEBUG=true已启用(开发必需);
第二步:运行命令php think optimize:config生成runtime/cache/config.php;
第三步:在config/app.php中设置'config_cache' => false(TP6.1+支持),或直接删掉runtime/cache/config.php并禁止其再生。
若跳过第三步,即使APP_DEBUG=true,只要config.php存在,框架仍会优先加载它——这不是bug,是设计行为。
停用路由缓存
新增路由访问404、注解路由不识别,大概率是路由缓存没关,框架还在用runtime/route/route.php里的旧规则。
第一步:确认app_debug => false已被注释或设为true——等等,开发环境必须设为true,所以路由缓存天然不生效?错。TP6允许debug模式下强制启用,得主动关。
第二步:打开config/route.php,加入配置'route_check_cache' => false;
第三步:删除runtime/route/route.php文件;
第四步:检查是否执行过php think route:cache——如果执行过,且没配route_check_cache=false,缓存就会强制加载。
【TP6.3起,即使APP_DEBUG=true,只要route_check_cache为true,仍会读取route.php】
清除数据库字段缓存
加了新字段却查不到、$model->getSchema()返回旧结构,是因为字段缓存存在runtime/cache/schema/下,且默认开启。
方法一:在database.php配置中设'fields_cache' => false;
方法二:代码中调用\think\facade\Db::clearCache(),它会清空schema缓存及查询缓存;
方法三:直接删runtime/cache/schema/目录——注意不是runtime/cache/整体,只删schema子目录即可。
删完立刻生效,无需重启服务或重载PHP进程。
一键清空所有Runtime缓存
上面改完配置,还得把残留缓存文件全干掉,否则旧文件仍在,新配置不生效。
执行命令:php think clear --all;
该命令会清空整个runtime/目录(包括view/、html/、route/、cache/、log/等所有子目录);
Windows用户若提示权限错误,改用rd /s /q runtime后再重建runtime目录;
Linux/macOS用户注意:确保CLI执行用户与Web服务器用户一致,否则新建的runtime子目录可能因权限问题无法写入。



















