cache::clear()无效是因为它只清当前驱动缓存,不清理runtime下模板、路由、配置等多层缓存;需手动删除对应目录并确保在app::initialize()后执行。

ThinkPHP 默认的 Cache::clear() 只清当前驱动的缓存,但热更新(比如文件重载、类重编译)常涉及多个缓存层:模板缓存、路由缓存、配置缓存、以及自定义的运行时缓存。如果只调用一次 Cache::clear(),很可能漏掉 runtime/cache/ 下的 .php 编译文件或 route.php 这类静态缓存。
实操建议:
- 热更新触发点必须在
App::initialize()后、请求分发前执行,否则路由/配置已加载,清理为时已晚 - 手动补全清理路径:
File::delete(runtime_path() . ‘cache/’)+File::delete(runtime_path() . ‘route/’) - 避免依赖
Cache::clear()的“全量”语义——它不等于清空 runtime 目录,只是调用驱动的clear()方法
想监听缓存写入/失效事件,不能靠轮询或外部脚本。ThinkPHP 没有原生缓存事件钩子,得从驱动层切入:继承 thinkcachedriverFile(或其他驱动),重写 set() 和 rm(),在其中触发自定义事件。
实操建议:
- 在
app/common/CacheMonitor.php中定义事件类,用thinkEvent触发cache_write/cache_delete - 在
config/cache.php中把type改成自定义类名,如‘type’ => ppcommonCacheMonitor::class - 注意:重写
set()时别漏掉父类逻辑,否则缓存实际没存进去——常见错误是只发事件、不调用parent::set()
热更新脚本里常用 Runtime::getCachePath() 获取缓存根目录,但它返回的是 runtime/cache/,而 ThinkPHP 6.1+ 把模板缓存默认放在 runtime/template/,配置缓存放在 runtime/config/。直接拼接 cache/ 子目录会漏掉这些。
实操建议:
- 不要硬编码路径,改用
Config::get(‘template.cache_path’)、Config::get(‘cache.path’)分别取各模块路径 - 检查
config/app.php中runtime_path是否被动态修改过(如多应用模式下),否则runtime_path()和实际路径不一致 - Windows 下路径分隔符可能混用
和/,清理前统一用str_replace(“, ‘/’, $path)处理
不是缓存没清,而是 ThinkPHP 的模板引擎在首次编译后会把 .html → .php 的映射固化在 runtime/template/ 的哈希文件里。即使你删了缓存,只要源模板没变时间戳,它就复用旧编译结果。
实操建议:
- 强制刷新模板编译:在开发环境配置
‘template’ => [‘auto_reload’ => true, ‘compile_time’ => false] - 热更新脚本里加一句
File::delete(runtime_path() . ‘template/’),比只清cache/更彻底 - 注意
auto_reload在生产环境必须关掉,否则每次请求都校验文件时间戳,性能明显下降
热更新机制本质是绕过重启进程的“伪实时”,所有缓存路径、驱动行为、生命周期钩子位置都得对齐真实加载顺序——差半步,就卡在旧缓存里出不来。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/266857.html