缓存驱动需为file或redis才支持Tag清除,apc等驱动会静默失败;动态Tag清除用Cache::tag('user_'.$uid)->clear(),多Tag清除需同时匹配;验证需检查tag_prefix配置、Redis索引及写入读取一致性。

确认缓存驱动是否支持Tag清除
打开 config/cache.php,检查 default 驱动类型和对应 stores 配置项;若 type 为 'file' 或 'redis',则可继续执行 Tag 清除;若为 'apc'、'wincache' 或 'xcache',【调用 Cache::tag()->clear() 将静默失败,且无任何报错】。
运行 php -r "var_dump(\think\facade\Cache::store()->getDriver());" 验证当前生效驱动,避免 .env 中 CACHE_DRIVER 覆盖导致误判。
拼接动态 Tag 名称并清除
方法一:使用字符串拼接构造带变量的 Tag
在控制器或命令行中写入:Cache::tag('user_' . $uid)->clear();,其中 $uid 来自请求参数或业务逻辑;这会清除所有标记为 user_123 的缓存项(如 profile、orders、settings)。
立即学习“PHP免费学习笔记(深入)”;
方法二:组合多个固定 Tag 实现交叉清理
执行 Cache::tag(['user', 'admin'])->clear();,适用于同时打上两个标签的缓存项;注意:该操作只清同时含这两个标签的项,不含仅含其一的项。
方法三:批量拼接多个动态 Tag 并逐个清除
先收集用户 ID 列表:$uids = [101, 102, 105];,再遍历清除:foreach ($uids as $uid) { Cache::tag('user_' . $uid)->clear(); };【不要用 Cache::tag('user_*')->clear(),ThinkPHP 不支持通配符语法】。
验证 Tag 清除是否真正生效
第一步:确认 tag_prefix 已正确配置
检查 config/cache.php 中 stores['file'] 或 stores['redis'] 下的 'tag_prefix' 值,例如 'tag:' 或 'tp_tag:';若为空或与实际存储不一致,【清除操作只会删索引,真实缓存键仍存在】。
第二步:Redis 环境下手动核对索引 key
进入 Redis CLI,执行 SCAN 0 MATCH tp_tag:user_123:* COUNT 500;若返回空结果,说明该 Tag 根本未写入索引——常见原因是调用了 set() 但没加 tag(),或缓存已过期自动剔除。
第三步:触发一次带 Tag 的写入再读取
执行 Cache::tag('user_123')->set('test_key', 'test_value', 3600),紧接着 Cache::tag('user_123')->get('test_key') 应返回 'test_value';清除后再 get,必须返回 null 才算成功。



















