php think clear 默认仅清 runtime/cache/、log/、session/、trace/ 四个目录,不包括 view/ 和 route.php,导致模板不更新或路由 404;加 --all 可清整个 runtime/。

tp5/tp6 的 php think clear 命令到底清什么
它默认只清 runtime/cache/、runtime/log/、runtime/session/ 和 runtime/trace/ 四个目录,但 不会清模板缓存(runtime/view/)和路由缓存(runtime/route.php) —— 这是多数人误以为“全清了”却仍遇到模板不更新、路由 404 的根本原因。
实操建议:
- 加
--all参数可强制清空整个runtime/目录:php think clear --all - 若只想清模板缓存,用
php think clear:template(tp6.1+ 支持;tp5 需手动删runtime/view/) - 清路由缓存必须单独执行:
php think route:clear(tp6)或删runtime/route.php(tp5)
在控制器或命令行类里调用清除逻辑
直接调用 think\Cache::clear() 只清缓存驱动里的数据(如 Redis/File 缓存),对 runtime/ 文件系统无影响;真正要删文件,得用 think\facade\Cache::clear()(tp6)或 think\Cache::clear('file')(tp5),但注意:这仅清 cache/ 子目录,不碰 view/route 等。
安全的代码级清理方式:
- tp6 推荐用
think\facade\Env::get('runtime_path')拼路径,再用think\helper\Dir::delete()删除指定子目录,比如删模板缓存:Dir::delete(Env::get('runtime_path') . 'view'); - tp5 中没有
Dir::delete(),可用原生rrmdir()函数或Filesystem类,但注意别误删runtime/根目录下的.gitignore或自定义配置文件 - 避免在生产环境自动触发全量清理,尤其不要在请求中执行
Dir::delete(runtime_path),可能引发并发写入冲突
为什么 php think clear 在某些 Linux 环境失败
常见报错如 Permission denied 或删了一半就中断,本质是 PHP 进程没权限删除其他用户(如 web 服务器)创建的 runtime 文件。典型场景:Nginx 以 www-data 运行,而你用 root 或普通用户执行命令。
解决办法:
- 统一运行用户:让
php think clear和 Web 服务使用同一用户,例如都切到www-data:sudo -u www-data php think clear --all - 改 runtime 目录权限:设为
775并启用 setgid(chmod g+s runtime),确保新生成文件继承组权限 - 避开权限问题:把
runtime/软链到/tmp/think-runtime-xxx这类所有用户可写的临时路径(开发环境可用,生产慎用)
模板缓存不刷新?先确认是否启用了 tpl_cache
tp6 默认开启模板缓存(view.cache_on = true),但如果你在 config/view.php 里关了它,runtime/view/ 就根本不会生成文件 —— 此时删它也没意义。而 tp5 的模板缓存开关在 config/template.php 的 cache_prefix 和 cache_time 控制。
检查与应对:
- tp6:查看
config/view.php中'cache_on' => true是否生效,且'cache_path'指向的是runtime/view/下的子目录 - tp5:确认
template.cache_path配置是否被覆盖,有些模块(如多语言模板)会动态改这个路径 - 开发阶段建议设
cache_time => 0,让模板每次重编译,避免反复清缓存
最常被忽略的一点:修改了模板文件后,如果用了 Swoole 或 RoadRunner 等常驻进程模型,runtime/view/ 文件虽删了,但内存里已加载的模板字节码还在 —— 此时必须 reload 服务,不能只依赖清文件。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











