thinkphp6多应用需从会话生命周期、cookie作用域、缓存隔离三层面协同实现session共享:统一配置session.name、cookie_domain、type为redis及prefix;禁用各应用独立session中间件;登录后regenerate(true)并存uid而非完整对象;跨主域或三端场景应改用token方案。

ThinkPHP6多应用环境下,Session默认不共享——每个应用独立初始化、独立存储、独立销毁。要实现跨应用共享(比如用户在home登录后,在admin也能识别身份),不能只靠改Redis配置,必须从会话生命周期、Cookie作用域、缓存隔离三个层面协同处理。
统一Session基础配置,确保底层一致
所有应用共用同一套Session参数是前提,否则即使数据存一处,解析或命名规则不同也会失效。
- 在
config/session.php中显式固定'name' => 'PHPSESSID',避免各应用因未设name而生成不同cookie名 - 强制指定
'cookie_domain' => '.example.com'(开头带点),使home.example.com和admin.example.com都能读写同一cookie -
'type' => 'redis'必须启用,并完整填写host、port、database、password;漏配会导致部分应用回退到file驱动 - 设置统一
'prefix' => 'tp6_shared_',防止多个应用往Redis写key时撞名(如都用think:session:xxx)
禁用各应用独立Session中间件
TP6多应用模式下,每个应用的middleware.php可能自带SessionInit,这会导致重复启动Session或覆盖配置。
- 检查每个应用目录下的
app/middleware.php,注释或删除\think\middleware\SessionInit::class - 只在全局
app/middleware.php中保留一次SessionInit,由框架统一接管 - 若使用
think-multi-app扩展,确认其未自动注入应用级Session中间件
区分应用逻辑,但不隔离登录态
共享Session不等于混用权限或数据。用户在home登录后进入admin,应能识别身份,但需按各自应用的权限系统校验操作合法性。
- 登录成功后调用
session()->regenerate(true),防止Session Fixation,且确保新ID在所有子域生效 - 将应用标识(如
app=home)写入Session变量(如session('login_app', 'home')),供后续路由或权限中间件参考,而非用于隔离Session本身 - 避免在
home里用session('user')存完整用户对象,而在admin里又存一遍;应统一用session('uid')+ 各自查库,保持轻量与一致性
注意多端与多域名的实际限制
Session共享有明确边界,超出则需换方案。
- 无法跨主域共享:.example.com 和 .other.com 之间不可能通过cookie共享Session,此时必须改用Token+Redis方案
- 本地开发用
localhost时cookie_domain无效,务必切到dev.example.com类真实二级域名测试 - 若存在小程序/H5/PC三端共用账号场景,不要依赖Session,改用带设备标识的Redis Token(如
token_web_123、token_mini_123)更可控
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











