必须先执行php think version确认实际TP版本,再按v5.1/v6.x/v8.0差异分别清理缓存路径、模板、路由、Redis及查询缓存,严禁直接套用统一命令。

多个ThinkPHP版本混用时,缓存路径、清理逻辑和命令参数不一致,直接套用同一套命令会导致漏清、误删或命令报错。
先确认当前项目实际运行的TP版本
执行php think version,看输出是ThinkPHP v5.1.42、v6.3.10还是v8.0.5——不同版本的php think clear行为差异极大,v5.1默认只删runtime/cache/和runtime/log/,v6.0起引入--except参数,v8.0新增Db::clearCache()专用接口。
【必须执行这一步】 不要凭composer.json或vendor目录名判断,有些项目vendor里装着TP6但入口文件加载的是TP5的thinkphp/library/,实际运行版本以think version为准。
按版本分路径清理文件缓存
文件缓存路径不是固定不变的,v5.1默认用runtime/cache/,v6.0起支持多应用模式后变成runtime/appname/cache/,v8.0又允许通过cache_path配置完全自定义。不能盲目删runtime/cache/*。
立即学习“PHP免费学习笔记(深入)”;
方法一:查配置定位真实路径
打开config/cache.php,找'default' => 'file'对应的'stores' => ['file' => [...]]段,确认'path'值;若为空,则v5.1用runtime/cache/,v6+用runtime/cache/或runtime/{app_name}/cache/(取决于是否启用多应用)。
方法二:代码动态获取路径
在控制器或命令行中执行:echo \think\facade\Cache::store('file')->getCachePath();
这行代码在v5.1/v6/v8都能运行,返回值就是当前生效的真实路径,复制出来再rm -rf最稳妥。
方法三:暴力匹配(仅限单应用且确定无自定义配置)
Linux下用:find runtime -path "*/cache" -type d -not -path "*/view" -not -path "*/route"
这条命令能列出所有疑似缓存目录,挨个ls -l看里面是否有.php或.data文件,有就删——【别直接对结果执行rm -rf】,先人工核对。
模板与路由缓存必须单独处理
TP5.1和TP6+对模板缓存的处理方式完全不同:v5.1把编译后模板全塞进runtime/view/,v6.0起模板缓存路径可配置,且php think clear -t只清默认路径;v8.0更进一步,-t参数已被废弃,改用php think clear:template。
第一步:确认模板缓存是否启用
检查config/template.php中'cache' => true且'cache_path'非空,否则删runtime/view/是白忙活。
第二步:按版本执行对应命令
① TP5.1:手动删runtime/view/目录
② TP6.0~TP6.3:执行php think clear -t
③ TP6.4+及TP7/TP8:执行php think clear:template
路由缓存同理:v5.1删runtime/route.php,v6.0+必须用php think route:clear,v8.0还支持--force强制重建。
Redis缓存要按前缀精准清理
多个TP版本共用一个Redis实例时,缓存key前缀可能冲突:v5.1默认用think:,v6.0起改为think_cache:,v8.0允许配置prefix,若没改过配置,三个版本的key前缀实际不同,但一旦有人手动改过config/cache.php里的'prefix',就会混在一起。
登录Redis CLI后执行:SCAN 0 MATCH think*:*
观察返回的key列表,如果看到think:user:123和think_cache:order:456同时存在,说明v5.1和v6+缓存共存;若全是tp8_:xxx,那就是v8.0统一了前缀。
安全清理方案:
只删明确属于当前项目的前缀:redis-cli --scan --pattern "think_cache:*" | xargs redis-cli del
这条命令不会影响think:或tp8_:开头的key,避免误伤其他TP版本的缓存。
模型查询缓存和字段结构缓存必须代码级清除
TP6开始,Db::table()->cache(true)->select()生成的查询缓存不走通用缓存驱动,而是写进runtime/query/(v6)或runtime/schema/(v8),php think clear完全不管这些目录。
v6.x项目中执行:\think\facade\Db::clearQueryCache();
v8.0项目中执行:\think\facade\Db::clearCache();
这两行代码会分别清掉runtime/query/和runtime/schema/下的文件,且不依赖命令行环境,放在任意控制器里都能生效。
注意:v5.1没有对应API,只能手动删runtime/query/目录(如果存在)。



















