ThinkPHP Session 失效主因是未真正启动或未显式保存:必须在app/middleware.php首项注册SessionInit中间件并执行php think clear清缓存;设置session后须调用Session::save()持久化;driver配置不能为空,file驱动需确保路径可写,Redis需装扩展并配全参数;cookie_domain须设为.example.com以支持跨子域,HTTP环境下需关闭secure选项。

ThinkPHP Session 失效不是单一配置错误,而是多个环节断开导致的连锁反应。核心问题往往出在“没真正启动”或“写了但没存住”,而不是代码写错了。
Session 根本没激活
TP6 和 TP8 默认不启用 Session,必须手动开启中间件。很多人误改 config/middleware.php,实际应修改 app/middleware.php:
- 打开 app/middleware.php,确保返回数组第一项是:
\think\middleware\SessionInit::class - 删掉旧缓存:
php think clear,否则配置不生效 - 临时验证:在控制器开头加
var_dump(session_status() === PHP_SESSION_ACTIVE);,输出 false 就说明根本没启动
写了数据但刷新就丢
TP6/TP8 的 Session 是延迟写入的,调用 session('key', 'val') 只是暂存内存,不主动保存就会丢失:
- 每次设置完 session 后,加一行:
\think\facade\Session::save(); - 或者在全局中间件里统一处理(如登录成功后、语言切换后)
- 别依赖“中间件里设了就自动持久化”——框架不会帮你自动落盘
存储路径或驱动配置缺失
TP6+ 不再默认回退到 file 驱动,'driver' => '' 会导致整个 Session 彻底静默失效:
立即学习“PHP免费学习笔记(深入)”;
- 检查 config/session.php,确认存在
'driver' => 'file'或'driver' => 'redis' - 若用 Redis,必须装
topthink/think-session扩展,并配置完整连接参数(hostname、port、password) - file 驱动下,运行
php -r "echo session_save_path();"看真实路径,再确认该目录对 Web 用户可写(如chmod -R 777 runtime/session)
Cookie 层面被浏览器拒绝
Session ID 通过 Cookie 传递,一旦 Cookie 不合法,每次请求都是新会话:
- HTTP 环境下,TP8 默认
'secure' => true,浏览器直接丢弃 Cookie → 改为false - 跨子域(如 www.example.com 和 api.example.com)→ 在 config/session.php 中设
'cookie_domain' => '.example.com' - 检查浏览器开发者工具 → Application → Cookies,确认是否存在
PHPSESSID;没有就说明 Cookie 没发出去或被拒收



















