清 Cache 和 Log 不生效是因为 Temp 和 Data 目录下的编译文件仍在生效:Temp 存模板编译 PHP 文件,Data 存 route.php 等缓存,需一并清理。

Runtime 目录里删了 Cache 和 Log,但请求还是走旧逻辑?不是缓存没清完,是 Temp 和 Data 下的编译文件还在生效。
为什么清了 Cache 还不生效
ThinkPHP 的运行时缓存分四层:Cache(模板/查询缓存)、Log(日志)、Temp(模板编译后的 PHP 文件)、Data(如配置缓存、路由缓存)。只删前两者,Temp 里的 .*.php 编译文件仍被 require;Data 里的 route.php 或 config.php 也会跳过重新生成逻辑。
-
Temp目录下文件名含哈希,比如1a2b3c4d5e_template_index.html.php,不删它,模板修改永远不生效 -
Data中的route.php是全站路由缓存,改了路由定义但没清它,Route::rule()新规则压根不加载 - 某些版本(如 TP5.1)还会在
Temp下生成thinkphp子目录,存框架自身编译片段,也得一并清理
安全又彻底的手动清理步骤
别直接 rm -rf Runtime/* —— Runtime 下可能有正在写的日志文件或锁文件,暴力清空可能让下次请求卡住。按需分目录处理更稳:
- 进项目根目录,执行:
rm -f Runtime/Cache/* Runtime/Log/* - 清模板编译:
rm -f Runtime/Temp/*.php Runtime/Temp/thinkphp/* - 清数据缓存:
rm -f Runtime/Data/*.php Runtime/Data/route.php Runtime/Data/config.php - 保留
Runtime/Log目录本身(防止写日志时报错),但清空内容即可
写个防手抖的一键清理脚本
把上面逻辑封装成 clear_runtime.sh,放在项目根目录,以后执行 bash clear_runtime.sh 就行。注意:不要用 find . -name "*.php" -delete 这类模糊命令,容易误删源码。
#!/bin/bash
RUNTIME="./Runtime"
[ -d "$RUNTIME" ] || { echo "Runtime dir not found"; exit 1; }
rm -f "$RUNTIME"/Cache/*
rm -f "$RUNTIME"/Log/*
rm -f "$RUNTIME"/Temp/*.php
rm -f "$RUNTIME"/Temp/thinkphp/*
rm -f "$RUNTIME"/Data/*.php
rm -f "$RUNTIME"/Data/route.php
rm -f "$RUNTIME"/Data/config.php
echo "Runtime cleared (Cache, Log, Temp, Data) — skip Runtime/ and subdirs like Temp/thinkphp"
CI/CD 或部署时的坑
很多部署脚本用 git clean -fdx,但它默认不清理 Runtime(因该目录通常在 .gitignore 中)。结果上线后缓存残留,行为和本地不一致。
- 部署后务必显式调用清理脚本,不能依赖 git 操作
- 如果用了 Swoole 或 RoadRunner,
Temp编译文件可能被常驻进程锁定,得先 reload 服务再清理 - 多服务器部署时,
Runtime一般不共享,每台机器都得单独清,别以为清了一台就全好了
最麻烦的其实是 Temp 下那些带随机串的 .php 文件——名字不固定、不报错、不提示,但就是不更新。盯紧它,比盯着 Cache 重要得多。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











