多站点共用ThinkPHP框架时,必须启用多应用模式以实现缓存物理隔离;未启用则所有站点共享runtime/cache/,清除缓存会相互干扰;启用后各站点缓存路径为runtime/站点名/cache/,可通过命令行rm -rf runtime/site_a/cache/*或设置APP_NAMESPACE后运行php think clear精准清理;Redis驱动下需配置不同prefix并按前缀删除key,严禁FLUSHDB。

多站点共用同一套ThinkPHP框架时,各站点缓存文件若混存在同一个runtime/cache/目录下,会导致A站清除缓存时误删B站数据、页面错乱或路由失效。
确认多应用模式是否启用
打开项目根目录下的config/app.php,查找'app_multi' => true或检查是否存在'app_namespace'配置;若未启用多应用模式,所有站点默认共享runtime/cache/,此时必须先启用多应用,否则无法物理隔离缓存。
若已启用多应用,每个站点会对应独立子目录,如runtime/site_a/cache/、runtime/site_b/cache/,这是分站清理的前提。
按站点名精准清理指定缓存目录
方法一:命令行直接删除对应子目录
立即学习“PHP免费学习笔记(深入)”;
进入项目根目录后执行:rm -rf runtime/site_a/cache/*(将site_a替换为实际站点名)
方法二:使用tp内置命令配合环境变量
在站点入口文件(如public/site_a/index.php)中临时设置$_ENV['APP_NAMESPACE'] = 'site_a';,再运行php public/site_a/index.php clear——该命令会自动识别当前命名空间并只清对应runtime/site_a/下的cache/、view/等子目录。
【注意】不设APP_NAMESPACE直接运行php think clear,仍会清理默认应用(通常是app)的缓存,对其他站点无效。
代码中动态切换缓存实例并清除
第一步:在控制器中获取当前站点标识(如从域名、请求头或路由参数提取)
第二步:构造独立缓存驱动配置,指定专属路径
第三步:实例化并清除
$store = Cache::store('file')->setOptions(['path' => RUNTIME_PATH . 'site_b/cache/']);
$store->clear();
这一步必须显式传入path,否则Cache::store('file')会走全局默认路径,清不到目标站点缓存。
Redis驱动下按前缀隔离清理
若多站点共用同一Redis实例,必须为每个站点配置不同缓存前缀。
检查config/cache.php中'stores' => ['redis' => [...]]部分,确认各站点的'prefix'值互不相同,例如'site_a:'、'site_b:'。
连接Redis后执行:redis-cli --scan --pattern "site_b:*" | xargs redis-cli del
这条命令只删除以site_b:开头的key,不会影响其他站点数据。
切记不要执行FLUSHDB——它会清空整个Redis库,导致所有站点缓存丢失。



















