ThinkPHP 7.0 缓存清理后数据不更新,大概率因多层缓存未同步清理:需分别处理字段结构缓存(php think clear:schema)、模板缓存(php think clear:template)、OPcache(opcache_reset())、Redis前缀隔离及业务层缓存写入逻辑校验。

ThinkPHP 7.0 缓存清理后数据仍不更新,大概率不是“没清干净”,而是缓存被多层机制拦截或绕过——比如字段结构缓存、模板编译缓存、OPcache、甚至浏览器或 CDN 层。关键要分清楚:你改的是哪类数据?是数据库字段、模板内容、还是业务逻辑返回值?不同位置得对应不同清理方式。
确认是不是数据库字段缓存没刷新
ThinkPHP 7.0 沿用 TP6 的字段结构缓存机制,表结构(如新增字段)会缓存在 `runtime/schema/` 下。即使你清了 `cache/`,字段信息依然旧的。-
运行命令强制刷新表结构缓存:
php think clear:schema
或直接调用代码:\think\facade\Db::clearCache();
立即学习“PHP免费学习笔记(深入)”;
-
开发阶段建议在
config/database.php中关闭字段缓存:'fields_cache' => false,
上线后再设为 true 以提升性能。
检查模板是否还在用旧编译文件
TP7 默认模板缓存路径是 `runtime/view/`,而 `php think clear` 默认**不清理它**。-
清理模板缓存的正确方式:
php think clear:template
(TP6.1+ 和 TP7 均支持) -
更彻底的做法(开发时):
删掉整个 runtime/view/ 目录
并在 config/template.php 中设置:'cache_time' => 0 —— 表示每次检查源文件修改时间,有变就重编译
排除 PHP 字节码和外部缓存干扰
ThinkPHP 本身不控制 OPcache、APCu、Redis 或 Nginx fastcgi_cache,但它们会影响你看到的结果。-
检查 OPcache 是否启用并校验时间戳:
确保 opcache.validate_timestamps = 1(php.ini 中)
开发时可临时加一行:opcache_reset(); 到入口文件顶部
-
如果用了 Redis 作缓存驱动:
执行 php think clear:cache 是安全的,但注意:若多个服务共用一个 Redis DB,Cache::clear() 可能清空其它系统的缓存
建议为 ThinkPHP 单独配置 Redis DB,或使用前缀(如 'prefix' => 'tp7_')
验证实际读取的缓存值,别靠猜
你以为缓存更新了,但程序可能根本没写进去,或读的是另一个键。-
在业务代码里加调试语句:
dump(cache('user_info_123')); —— 看真实返回值
dump(cache('user_info_123', null)); —— 强制读,不触发回调
-
写缓存时避免“值未变就不写”陷阱:
TP7 仍保留部分版本中 cache($key, $val) 的 === 比较逻辑;若 $val 和旧值完全相等,可能跳过写入
稳妥做法是显式调用:cache($key, $val, 3600); 或用 Cache::set($key, $val, 3600);
不复杂但容易忽略。



















