TP6 Session 失效主因是默认不启用、不自动保存、不兼容旧配置;须显式注册SessionInit中间件并前置Lang、调用Session::save()手动保存、完整配置driver/prefix/cookie参数。

ThinkPHP6 Session 失效不是“不能用”,而是框架默认不启用、不自动保存、不兼容旧配置。只要配对正确,Session 完全可用——登录态、验证码、多语言切换等都依赖它。关键在三步:显式初始化、手动保存、完整驱动配置。
必须注册并前置 SessionInit 中间件
TP6 不再自动启动 Session,哪怕你写了 session('user_id', 1),没初始化就等于白写。
- 打开
app/middleware.php,确认已注册\think\middleware\SessionInit::class - 多应用项目(如
admin或api)需在对应应用的middleware.php中单独配置,全局配置不生效 - 若使用多语言,
SessionInit必须排在Lang中间件之前,否则语言偏好读不到
设置后必须立即调用 Session::save()
TP6 的 Session 是延迟写入机制:赋值只缓存在内存,响应结束前不保存,数据就不会落盘或写入 Redis。
由 ReMe 驱动的记忆管理系统,支持跨会话记忆持久化、自动应用用户偏好以及智能上下文压缩...
- 在设置 Session 后加一行:
\think\facade\Session::save(); - 可统一放在
BaseController::initialize()或自定义中间件末尾,避免每个方法重复写 - 若用了
die/exit提前终止流程,save()就不会执行 → Session 必然丢失
驱动与配置必须显式声明且完整
TP6 不再 fallback 到 file 驱动;driver 为空 = Session 彻底禁用,且静默失败。
- 检查
config/session.php,确保'driver' => 'file'或'redis'明确存在 - Redis 场景下,
'prefix'必须是非空字符串(如'admin:'),否则多项目 key 冲突 - PHP 8.1+ 环境下,显式设置
'cookie_httponly' => true,否则浏览器可能拒绝接收 Cookie - 生产环境(尤其 HTTPS)务必开启
'secure' => true和'samesite' => 'Lax';不建议硬设'None',Chrome 80+ 会直接丢弃
Cookie 安全参数需按环境匹配
本地开发无感,上生产立刻失效——常见于 config/cookie.php 中 'secure' => true,但 PHP 配置里 session.cookie_secure 未同步开启。
- 检查 php.ini:确保
session.cookie_secure = 1(HTTPS 环境)或= 0(HTTP 开发环境) - 前端请求需带 Cookie:
credentials: 'include'(fetch)或withCredentials: true(axios) - 后端响应头需允许跨域 Cookie:配合
Access-Control-Allow-Credentials: true及明确的Access-Control-Allow-Origin
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










