tp6接口场景session失效的根本原因是框架默认不启用、不自动保存、不兼容旧配置;必须显式初始化session中间件、手动调用session::save()、完整声明driver及prefix等配置,并按环境设置cookie安全参数。

TP6 接口场景下 Session 失效,根本原因不是“不能用”,而是框架默认不启用、不自动保存、不兼容旧配置。接口(尤其是 API 类应用)常被误认为无需 Session,但像登录态、验证码、临时 Token 绑定等仍依赖它——只要没配对,就会出现“设了取不到”“刷新就丢”“验证码总错”等问题。
必须显式初始化 Session 中间件
TP6 不再自动启动 Session,哪怕你写了 session('user_id', 1),没初始化就等于白写。
- 打开
app/middleware.php,确保已注册\think\middleware\SessionInit::class - 多应用项目(如 admin/api)需在对应应用的
middleware.php中单独配置,全局配置不生效 - 不要依赖 TP5.1 的
Session::init()或session_start(),TP6 已移除该方式
设置后必须手动保存
TP6 的 Session 是延迟写入机制:赋值只是缓存在内存里,响应结束前不调用保存,数据就不会落盘或写入 Redis。
安全地重置 OpenClaw agent sessions,支持备份、预览、恢复和批量操作。用于:1) 清理过期的 agent 会话上下文,2) 重置特定 agents 的 session,3) 批量重置六部/秘书 sessions,4) 查看和恢复历史备份。当用户需要"reset session"、"清理 se...
- 在设置 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
Cookie 安全参数需按环境开启
TP6 的 cookie() 默认关闭 HttpOnly 和 Secure,本地开发无感,上生产(尤其 HTTPS)立刻失效。
- 生产环境务必设置:
cookie('token', $val, ['httponly' => true, 'secure' => true, 'samesite' => 'Lax']) - 不建议硬写
samesite => 'None',Chrome 80+ 会直接丢弃;跨域需求应配合 CORS + JWT 替代方案 - 验证码类接口,要确认前端请求带 Cookie(
credentials: 'include'),后端响应头含Access-Control-Allow-Credentials: true










