必须启用多应用模式并按站点名隔离缓存目录或使用缓存标签:检查app.php中'app_multi'=>true,运行php think app:multi创建site_a/site_b等子应用目录,缓存自动写入runtime/site_a/cache/等独立路径;或用cache::tag(['site_a','user'])->set()绑定标签,再通过cache::tag('site_a')->clear()精准清理。

ThinkPHP6多站点共用一个项目时,各站点缓存混在一起导致数据污染、页面错乱或接口返回旧数据,必须按站点维度精准隔离并清理对应缓存。
确认当前是否启用多应用模式
打开项目根目录下的 app.php 配置文件,检查 ['app_multi'] 是否为 true;若为 false 或未定义,则当前是单应用结构,多站点仅靠域名路由区分,缓存默认全部落在 runtime/cache/ 下,无法天然隔离——此时必须手动改造缓存路径或启用多应用。
运行命令 php think app:multi 可一键开启多应用模式,它会自动创建 app/site_a/、app/site_b/ 等目录,并将各站点的运行时缓存写入 runtime/site_a/cache/、runtime/site_b/cache/ 等独立子目录。
按站点名精准清理指定缓存目录
方法一:使用系统命令直接删除(推荐用于生产环境紧急处理)
进入项目根目录,执行:
rm -rf runtime/site_a/cache/*
这一步必须严格核对站点目录名,site_a 是你在 app.php 中配置的 app_namespace 或应用目录名,不是域名。输错会导致删错目录,且不可逆。
方法二:通过 ThinkPHP 命令行指定应用清理
第一步:切换到目标站点的应用上下文
php think clear --app=site_a
第二步:强制清空该站点下所有缓存类型(含 cache、temp、config、route)
php think clear --app=site_a --all
注意:TP6.0+ 才支持 --app 参数,低于此版本会报错“Unrecognized option”。执行前先运行 think version 确认版本号。
用缓存标签实现跨应用逻辑隔离
即使启用多应用,若多个站点共用同一套业务代码(如统一用户中心),仍可能因 Cache::set('user_1001', $data) 写入相同 key 导致覆盖。此时必须绑定站点标识为缓存标签。
在站点 A 的控制器中写缓存:
Cache::tag(['site_a', 'user'])->set('profile_1001', $data, 3600)
在站点 B 中写同用户数据:
Cache::tag(['site_b', 'user'])->set('profile_1001', $data, 3600)
清理时只需执行:
Cache::tag('site_a')->clear()
这会精准清除所有打上 site_a 标签的缓存项,不影响 site_b 的任何数据。但注意:只有 file 和 redis 驱动支持 tag 功能,apc、xcache 不可用。
验证缓存是否真正隔离
第一步:访问站点 A 页面,触发一次带缓存的查询(如用户信息接口)
第二步:访问站点 B 同一接口,观察返回数据是否与 A 一致;若一致,说明未隔离
第三步:登录服务器,执行 ls -l runtime/*/cache/,确认 site_a/cache/ 和 site_b/cache/ 下均有新增文件,且文件名不重复
第四步:手动删除 runtime/site_a/cache/ 全部内容,刷新站点 A 页面,应看到缓存重建日志或响应时间明显变长;而站点 B 页面不受影响
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











