thinkphp 8.0 清理缓存后仍返回旧数据,是因为 php think clear --all 仅清除驱动级缓存,未触达配置、路由、模板、模型查询、字段结构这其余四层;需按需执行 config:cache、clear:route、-t 参数、db::clearcache() 等对应命令。

ThinkPHP 8.0 清理缓存后仍返回旧数据,不是“清得不够狠”,而是没对准缓存层级——TP8 的缓存分五层:配置、路由、模板、模型查询、驱动级数据,php think clear --all 只动最后一层,其他四层默认不碰。
一、确认你清的是哪一层
不同缓存由不同机制管理,清理命令不通用:
-
配置缓存(runtime/config.php):改 config/app.php 或 .env 后不生效,需
php think config:cache重建,删文件或config:clear不够 -
路由缓存(runtime/route.php):注解或 route.php 修改后 404,必须
php think clear:route && php think route:cache --annotation -
模板编译缓存(runtime/view/):改了 .html 或 .php 模板没刷新,要加
-t参数:php think clear --all -t -
模型查询缓存(如
UserModel::cache(true)->select()):完全独立于 Cache 驱动,不走标签也不进 prefix,只能靠Db::clearCache()或设短有效期 -
字段结构缓存(runtime/schema/ 或 runtime/temp/):表结构变更后报错“字段不存在”,需显式调用
\think\facade\Db::clearCache()
二、检查缓存是否真被删了
别信命令返回 true,要验证落地结果:
- 查文件是否存在:
var_dump(is_file(runtime_path() . 'cache/xxx.php')) - 查 Redis 是否还存 key:
redis-cli -a yourpass exists "think_user_123" - 查标签索引是否残留:
redis-cli -a yourpass scan 0 match "tp_tag:user:*" count 100 - 确认当前生效的缓存驱动:
config('cache.default'),避免 .env 覆盖了 stores 配置却没生效
三、警惕 OPcache 锁死代码
即使所有 runtime 文件都删了,config('app.app_name') 还是旧值?大概率是 PHP 的 OPcache 把 config/app.php 编译后的 opcode 锁在内存里了:
- 访问
phpinfo()确认 OPcache 已启用 - 执行
opcache_reset()(需确保opcache.restrict_api允许) - 或重启 PHP-FPM:
sudo systemctl restart php-fpm - 注意:Docker 环境中,OPcache 是容器进程级的,只重启应用不重启 PHP 进程无效
四、绕过缓存快速验证
不确定是不是缓存问题?比清理更安全的是临时绕过:
- 把
config/cache.php中'default' => 'null',重启服务看异常是否消失 - Redis 用户可临时改
config/cache.php中 redis host 为127.0.0.1:63790(无效端口),触发降级 - 开发时在
public/index.php顶部加define('THINK_ROUTE_CACHE', false);强制跳过路由缓存
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











