最直接后果是“错”而非“慢”:改代码、加路由、更新模板后页面不变或报404/class not found/字段不存在等错误,根源常是删错位置、没清干净或缓存未启用。

ThinkPHP缓存无法清除,最直接的后果不是“慢”,而是“错”——你改了代码、加了路由、更新了模板,页面却纹丝不动,或报404、Class not found、字段不存在等看似低级却查不出原因的错误。问题根源往往不是缓存没删,而是删错了地方、没删干净,或缓存根本没被真正启用。
路由不生效:改了app.php还是404
这是最典型的缓存残留表现。你以为执行了php think clear就清完了,其实它完全不碰runtime/route.php。新路由注册后访问仍404,php think route:list也看不到,说明路由映射表压根没更新。
- 必须用专用命令:
php think route:clear - 若命令失效,直接删除
runtime/route.php(TP6单文件模式) - 确认
config/app.php中'app_route' => true是布尔值true,不是字符串 - 检查路由是否写在
app/route/app.php,且顶部有use think\facade\Route;
模板不刷新:改了HTML页面还是旧内容
模板缓存存在runtime/view/下,和runtime/cache/完全隔离。php think clear默认不清理它,所以你改了index.html,页面却一直显示编译后的旧PHP结果。
- 开发环境推荐一键清理:
php think clear -t && php think route:clear(-t专清runtime/view/) - 手动清理时,务必删整个
runtime/view/目录,不要只删*.php——子目录里的哈希文件会漏掉 - 调试阶段可临时禁用:
config/template.php中设'cache' => false或'cache_time' => 0
数据/字段缓存滞后:新增数据库字段读不到
框架默认开启字段缓存(DB_FIELDS_CACHE),改完表结构后,Db::table('user')->field('new_col')仍报错“unknown column”,是因为缓存里还记着旧结构。
- 运行
\think\facade\Db::clearCache()强制刷新全部表结构缓存 - 或直接删
runtime/cache/schema/下的对应文件 - 开发时建议在
database.php中关闭:'fields_cache' => false - 注意:该缓存与
runtime/cache/里的业务数据缓存无关,不能靠Cache::clear()解决
缓存“假清除”:删了又自动恢复或根本没起效
有时候你删了runtime/cache/,但几秒后文件又出现;或者明明清了,cache('key')读到的还是旧值——这往往不是缓存没删,而是干扰源在更外层。
- 检查
APP_DEBUG = true:开启调试模式时,路由/模板缓存本就不加载,此时404是真实解析失败,不是缓存问题 - OPcache干扰:尤其宝塔、Docker环境,改了
app/route/app.php但PHP还在用旧字节码,需重启php-fpm或调用opcache_reset() - Web服务器伪静态未转发:Nginx/Apache没把请求打到
index.php,请求根本没进框架,自然不走任何PHP缓存 - 浏览器或CDN缓存301跳转:换无痕窗口测试,或加时间戳参数(如
?t=123)绕过
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











