ThinkPHP 6.0 默认不启用 Session,需显式添加 SessionInit 中间件并配置 session.php 驱动(如 file/redis),通过 think\facade\Session 门面操作数据,Redis 驱动需注意序列化、扩展及域名共享设置。

ThinkPHP 6.0 默认不启用 Session,必须显式开启并正确配置驱动,否则调用 Session::set() 等方法不会生效。
启用 Session 中间件
Session 功能依赖中间件初始化。在 app/middleware.php 全局中间件列表中加入:
'think\middleware\SessionInit'::class
多应用模式下,也可只在特定应用的中间件文件中添加。未加此中间件,Session 类无法自动启动,所有操作均无效。
配置 session.php 驱动类型
打开 config/session.php,关键配置项如下:
立即学习“PHP免费学习笔记(深入)”;
由 ReMe 驱动的记忆管理系统,支持跨会话记忆持久化、自动应用用户偏好以及智能上下文压缩...
-
type:设为
'file'(默认,存本地文件)、'redis'(推荐用于生产环境)或'cache' -
expire:过期时间(秒),如
1440(24 分钟) -
name:session 名称,默认
'PHPSESSID',可按需修改 -
prefix:避免多项目冲突,建议设为带项目标识的字符串,如
'myapp_' - var_session_id:跨域或 Flash 场景下指定提交变量名,一般留空
若选 'redis',还需配置 store 字段(如 'redis'),并确保 config/cache.php 中对应 Redis 连接已正确设置 host、port、password(含特殊字符需 URL 编码)、database。
使用 Session 类操作数据
必须通过门面类 think\facade\Session 操作,不再支持 $_SESSION 或原生 session_start():
- 写入:
Session::set('user_id', 123)或支持点语法Session::set('user.name', '张三') - 读取:
Session::get('user_id')、Session::all() - 判断存在:
Session::has('user_id') - 删除:
Session::delete('user_id')或清空全部Session::clear() - 闪存(仅下次请求有效):
Session::flash('msg', '操作成功')
注意:Session 数据在请求结束时统一写入,中途执行 exit 或 die 会导致写入丢失。
Redis 驱动常见问题处理
启用 Redis 后登录态异常(如反复跳转登录页),大概率是序列化不一致:
- 在 config/session.php 中添加
'serialize' => 'php'(TP6.0.10+ 支持) - 确保 phpredis 扩展已安装(非 predis),且
cache()->store('redis')->handler()能返回有效 Redis 实例 - 多子域名共享 Session 时,必须设置
'domain' => '.example.com'(注意开头的点) - Unix socket 连接写法:
'host' => 'unix:///var/run/redis.sock'
不复杂但容易忽略


















