缓存清除不生效需逐层排查:先确认config/cache.php中'path'配置及cache::getstore()->getcachepath()输出的真实路径,检查属主、权限与x执行位;再区分清文件缓存(find命令递归删除)、redis缓存(redis-cli flushdb并核对prefix)、路由/模板/字段等多级缓存;最后验证web进程用户一致性并排除opcache、cdn或反向代理缓存干扰。

缓存清除不生效,不是命令没敲,而是清的不是地方、没清干净、或者根本没真正写进去。得一层一层往下扒。
先确认你清的是“对的缓存”
ThinkPHP6 默认用 file 驱动,但很多人部署时早把 config/cache.php 里的 'path' 改成了 /data/myapp_cache/ 或 /var/tmp/thinkcache/。你猛删 runtime/cache/,实际缓存却在别处——白清。
- 打开
config/cache.php,看'path'值是不是自定义路径 - 在控制器里加一行:
dump(Cache::getStore()->getCachePath());,运行后看输出的真实路径 - 用
ls -ld /真实路径检查属主、组、父目录是否都有x权限(缺 x 就进不去)
别只信 php think clear
这个命令默认只清 runtime/cache/ 下的 .php 文件,但标签缓存(如 Cache::tag('user')->set())会生成子目录 runtime/cache/user/,它不会递归删;Redis 缓存更是一点不动。
- 清文件缓存要彻底:用
find runtime/cache -type f -name "*.php" -delete - 清 Redis 缓存不能靠命令:得手动连 redis-cli,执行
FLUSHDB,并核对stores.redis.prefix是否匹配(比如是think_cache:,就先keys "think_cache:*"看有没有残留) - 多级缓存必须分开清:路由缓存(
runtime/route/)、模板缓存(runtime/view/)、字段结构缓存(runtime/schema/)全得手动删或用对应命令(如php think clear -t、php think clear --schema)
检查权限和进程用户是否真一致
你用 chown -R www-data:www-data runtime/cache,但 PHP-FPM 实际 worker 进程跑的是 nginx 或 apache 用户,那还是写不进。
- 查真实 Web 进程用户:
ps aux | grep php-fpm | head -1 | awk '{print $1}' - 模拟写入测试:
sudo -u www-data touch runtime/cache/test && echo ok > runtime/cache/test,报错就说明用户不对 - 改完权限后必须重启 PHP-FPM 和 Web 服务(Nginx/Apache),否则旧进程还在用老用户跑
小心那些“看不见”的缓存层
你以为清了 PHP 层,但请求可能被卡在更外层:
- 用
curl -I http://your-api.com/xxx看响应头:有X-Cache、Age或Cache-Control: public?那是 CDN、Nginx proxy_cache 或 Apache mod_cache 在起作用 - 检查 Nginx 是否开了
fastcgi_cache,开了就得清对应 cache 目录并nginx -s reload - OPcache 也会缓存配置和路由逻辑:执行
php -i | grep opcache.enable,若为On,需重启 PHP-FPM 或调用opcache_reset()
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











