ThinkPHP缓存清理后接口仍返回旧数据,是因为仅清除了默认缓存路径,而模型查询缓存、模板编译缓存、字段结构缓存及自定义缓存实例未被触达,需分别执行php think clear --model、--schema、-t及Cache::store('name')->clear()等针对性操作。

ThinkPHP项目缓存清理后接口仍返回旧数据,说明你只清了表面缓存,而模型层查询缓存、模板编译缓存、字段结构缓存或自定义缓存实例根本没被触达——这些缓存不走默认清理路径,必须逐项定位并手动清除。
确认当前生效的缓存驱动和配置
打开 config/cache.php,检查 default 值;再核对 .env 中是否覆盖了 CACHE_DRIVER 或 CACHE_PATH。比如写成 CACHE_PATH=/tmp/my_cache 却没同步到 stores['file']['path'],会导致 Cache::clear() 去删错目录,【实际缓存文件还在 runtime/cache/ 下,但命令删的是 /tmp/my_cache】。
运行 php think cache:info 查看当前驱动类型及路径(TP8.0+ 支持),输出中必须包含 real_path 字段,否则说明驱动未正确加载。
清除模型层查询缓存(极易遗漏)
ThinkPHP 的 UserModel::where()->cache(true)->select() 生成的缓存 key 不进标签系统,也不受 --all 参数影响,它直接写入 runtime/cache/ 下的独立文件,且文件名含哈希,无法被常规扫描匹配。
立即学习“PHP免费学习笔记(深入)”;
方法一:强制刷新单个查询缓存
在控制器中调用时显式传 null 清键:Cache::tag('user')->set('list', $data, 3600) 写入 → 后续用 Cache::tag('user')->get('list') 读取 → 清除必须走 Cache::tag('user')->clear(),不能用 cache('list', null)。
方法二:全局清空模型缓存
执行 php think clear --model(TP8.0 新增命令),该命令会遍历 runtime/cache/model/ 目录并删除所有以 model_ 开头的 PHP 缓存文件。
清除模板编译缓存(常被误认为是数据问题)
改了控制器逻辑但接口返回内容没变?可能是因为模板引擎把输出结果编译成 PHP 文件存在 runtime/view/,下次请求直接 require 它,根本没执行新代码。
第一步:删 runtime/view/ 整个目录
Linux/macOS 执行 rm -rf runtime/view/;Windows 执行 rd /s /q runtime\view。【别只删 *.php,哈希子目录里的文件通配符匹配不到】
第二步:加 -t 参数触发模板缓存清理php think clear --all -t —— TP8.0 中 -t 表示 include template,必须显式带上,否则 --all 默认不碰 view 目录。
清除字段结构缓存(表结构变更后必做)
新增数据库字段后接口查不到新字段值,90% 是因为字段缓存没更新。它存在 runtime/schema/ 或 runtime/temp/ 下,与 Cache::clear() 完全无关。
① 运行命令清除:php think clear --schema(TP8.0 支持)
② 或在控制器中调用:\think\facade\Db::clearCache();
③ 最彻底方式:手动删除 runtime/schema/ 下所有 .php 文件 + runtime/temp/ 下所有以 fields_ 开头的文件。
检查并清理自定义缓存实例
如果你写了 Cache::store('my_redis')->set('key', $val),那么 Cache::clear() 和 php think clear --all 都不会动它。
方法一:代码中显式清除Cache::store('my_redis')->clear(); —— 注意必须指定 store 名,不能依赖 default。
方法二:Redis 中按前缀清理
如果自定义 store 使用了 prefix(如 'prefix' => 'api_v2_'),需连接 Redis 执行:redis-cli --scan --pattern "api_v2_*" | xargs redis-cli del。



















