根本原因是多应用共用redis且未隔离命名空间;必须为每个应用显式配置stores.redis.prefix,如admin:'、api:',二级域名场景需用闭包动态生成前缀,并确保session与cache前缀严格区分。

ThinkPHP 配置二级域名后出现 Redis 键冲突,根本原因不是域名本身,而是多应用共用同一套 Redis 连接且未做命名空间隔离——框架默认不会把应用名、域名自动注入缓存 key,所有应用若沿用默认 think: 前缀或相同 prefix,就会在 Redis 中写入重复 key,导致数据覆盖、页面错乱、登录态丢失等问题。
Redis 缓存前缀必须按应用显式配置
ThinkPHP 6 多应用模式下,每个应用独立加载自己的 config/cache.php,但默认不带应用标识。你不能依赖全局配置,而应在每个应用的缓存配置中手动设前缀:
- 打开
app/admin/config/cache.php,设置'stores' => ['redis' => ['prefix' => 'admin:']] - 同理,
app/api/config/cache.php设为'prefix' => 'api:',app/index/config/cache.php设为'prefix' => 'web:' - 前缀建议用小写字母+冒号,长度控制在 16 字以内,避免含
/、空格、点号等非法字符
二级域名场景需动态生成前缀(非固定应用名)
若多个二级域名(如 admin.example.com、shop.example.com)共用同一个应用目录(即单应用 + 多域名),则不能写死前缀,而应动态提取域名:
- 在
config/cache.php的'prefix'项中使用闭包:'prefix' => function() { $host = $_SERVER['HTTP_HOST'] ?? 'default'; $host = preg_replace('/:\d+$/', '', $host); return strtolower(str_replace(['.', '_'], '-', $host)) . ':'; } - 该闭包每次创建缓存实例时执行,能确保
admin-example-com:和shop-example-com:完全隔离 - 命令行任务(如定时器)中
$_SERVER['HTTP_HOST']为空,需 fallback 到环境变量或默认值,例如:$host = $_SERVER['HTTP_HOST'] ?? env('DEFAULT_HOST', 'cli');
Session 与 Cache 前缀必须严格分开
Redis 中 session 和 cache 共用同一数据库时,若前缀相同(比如都用 tp6:),执行 FLUSHDB 或按前缀清理会误删 session 数据,造成用户批量掉线:
- Session 前缀配在
config/session.php的'redis' => ['prefix' => 'sess:'] - Cache 前缀配在
config/cache.php的'stores.redis.prefix' => 'cache:' - 两者前缀字符串不可相同,哪怕只差一个冒号也要区分开,例如
sess:login_vscache:home:
验证与清理旧缓存
改完前缀不等于立即生效,旧 key 仍留在 Redis 中,新老前缀并存会导致行为混乱:
- 用
redis-cli -n 0 keys "admin:*"检查是否只有预期 key;若还有think:route:类旧 key,说明部分缓存仍走默认前缀 - 确认所有子应用的
config/cache.php都已修改,尤其注意生产环境路径(如config/production/cache.php) - 上线前人工清旧缓存:
redis-cli -n 0 eval "return redis.call('KEYS', ARGV[1] .. '*')" 0 'think:'扫描后逐个 del,或直接flushdb(评估业务影响)
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











