ThinkPHP 8.1 缓存清理失败主因是四层缓存(框架级、模板编译、OPcache、环境配置)未按序排查清除:需先验APP_DEBUG、查runtime目录文件及权限、确认OPcache是否启用并排除runtime、核对真实环境变量,再执行php think clear:config && config:cache等闭环命令,并重载PHP-FPM。

ThinkPHP 8.1 缓存清理失败,通常不是命令没执行,而是缓存“藏得深”或“锁得死”——框架缓存、OPcache、文件权限、环境配置四层叠加,漏掉一层就白清。关键得按顺序查,不能只删文件。
先确认到底在用哪层缓存
不是所有缓存都叫“runtime/cache”。ThinkPHP 8.1 分三类缓存,清理前必须分清:
-
框架级缓存:如
runtime/config.php、runtime/route.php、runtime/schema/下的字段结构文件,由php think config:cache等命令生成,受APP_DEBUG控制; -
模板编译缓存:默认在
runtime/template/,但实际路径由config('template.template_cache_path')决定,可能被自定义后指向非法路径而静默回退; -
PHP OPcache:会缓存已加载的 PHP 文件(包括刚生成的
runtime/config.php),即使你删了文件、重跑了命令,OPcache 仍返回旧内容。
逐层排查与对应操作
按顺序检查,跳过任一环节都可能误判:
- 运行
var_dump(config('app.debug'));→ 若输出 true,说明框架跳过所有缓存,此时清理无效一定是 OPcache 或模板路径问题; - 执行
ls -la runtime/ | grep -E "(config|route|schema|template)"→ 看对应目录/文件是否存在、是否为空、权限是否为 web 用户可读; - 检查
phpinfo()中 OPcache 是否启用,以及opcache.file_exclude是否包含runtime目录; - 用
php think env:get APP_DEBUG和php think env:get QUEUE_CONNECTION等命令确认环境变量真实生效值,避免 .env 被 config/app.php 覆盖。
清理动作必须闭环,不能只做一半
常见“以为清了,其实没清”的操作:
立即学习“PHP免费学习笔记(深入)”;
- 只删
runtime/config.php,但没运行php think config:clear→ 后者还会清容器内配置实例,前者只是表面; - 执行了
php think clear,但runtime/不可写 → 命令静默失败,无任何提示; - 清完缓存后没重载 PHP-FPM 或重启 Apache → OPcache 仍在服务旧字节码;
- 改了
config/database.php的fields_cache,但没删runtime/schema/下已有缓存 → 新配置不触发重建,旧缓存继续生效。
生产环境推荐的清理脚本组合
部署时直接用,避免遗漏:
-
强制清空并重建配置缓存:
php think clear:config && php think config:cache -
路由缓存闭环:
php think clear:route && php think route:cache --annotation -
模板缓存归零:
rm -rf runtime/template/ && mkdir -p runtime/template/(再配好权限) - 最后加一句:
sudo systemctl reload php8.1-fpm(根据实际 PHP 版本调整)



















