php think clear --all 清不掉模型查询缓存,因该命令仅清驱动级缓存(如runtime/cache/、Redis带prefix的key),不处理模型层cache()生成的独立key、模板缓存(需-t)、字段结构缓存(需Db::clearCache)。

升级 TP8 后缓存没清干净,不是命令没跑,而是你清的压根不是那块缓存。
php think clear --all 为什么清不掉模型查询缓存
TP8 的 php think clear --all 只清理「驱动级缓存」——也就是 runtime/cache/ 下的文件、Redis 中带 prefix 的 key。但以下三类完全不碰:
- 模型层显式启用的查询缓存,比如
UserModel::where('id', 1)->cache(true)->find()生成的 key 是独立拼的,不走标签也不进默认 prefix - 模板编译缓存(存于
runtime/view/),必须加-t参数才能清:php think clear -t - 字段结构缓存(
runtime/schema/或runtime/temp/),得手动调\think\facade\Db::clearCache()
升级后如果发现 DB 字段变了但查出来还是旧结构,大概率是这里卡住了。
Cache::clear() 在控制器里返回 true 却没删掉数据
这不是代码写错了,而是运行时根本没连上你认为的那个缓存驱动:
- 检查
config/cache.php中default值,再确认.env有没有用CACHE_STORE=file覆盖了它 - 别依赖容器自动解析:显式指定驱动,比如
Cache::store('redis')->clear(),否则可能 fallback 到null驱动,啥也不干 - 验证是否真删了:执行完立刻查
file_exists(runtime_path() . 'cache/xxx.php'),或 Redis 里跑exists think_user_123,别只信返回值
想清某个标签下的所有缓存,Cache::tag('user')->clear() 没反应
标签清理失败,90% 是驱动不支持或配置错位:
- 只有
file、redis、memcached实现了完整标签清理;apc、wincache调了也白调 - Redis 下必须设
'tag_prefix' => 'tp_tag:',否则索引 key(如tp_tag:user)和实际数据 key 对不上 - 线上不敢用
keys,兜底方案是:用scan 0 MATCH "tp_tag:user:*" COUNT 1000找出索引,再用sMembers拿真实 key,最后DEL数据 + 索引
升级后 config() 还读旧值?别急着删 runtime
TP8 的配置缓存分两层:框架生成的 runtime/config.php + PHP OpCache。删了前者,后者还在锁着旧字节码:
- 先确认
config/app.php中'app_debug' => false,且.env没覆盖成APP_DEBUG=true - 执行
php think config:cache重建runtime/config.php,注意runtime/目录权限必须可写 - OpCache 必须重载:重启 PHP-FPM,或调
opcache_reset()(仅限 CLI 或调试环境)
最常被忽略的是 OpCache —— 即使 runtime/config.php 已更新,config('app.name') 仍可能返回旧值,因为 PHP 还在执行缓存里的 opcodes。

















