必须使用ThinkPHP6封装的Session/Cookie类接口:Session::set()存、Session::get()读、Session::pull()读删一体、Session::has()判存、Cookie::set()设持久化、登出时同步清Session和Cookie。

要在ThinkPHP 6.0中稳定保存用户登录态、实现“记住我”或跨请求传递临时数据,必须绕过原生$_SESSION和setcookie(),严格走框架封装的Session类与Cookie类接口,否则会直接失效或报500错误。
设置与读取Session数据
方法一:使用Session门面静态方法(推荐,全局可用)
第一步:在控制器方法中写入 Session::set('user_id', 10086) → 存入整型ID
第二步:读取时用 Session::get('user_id'),若key不存在返回null,不会报错
第三步:需要一次性读取后清除(如登录成功提示),改用 Session::pull('msg'),第二次调用即为空
注意:Session::set('cart.items', ['a','b']) 支持点号嵌套赋值,但必须先存数组结构,否则会覆盖上层键
方法二:通过Request对象操作(适合带参数的控制器方法)
直接调用 $request->session('user.token') 即可读取嵌套值,无需先获取整个session数组
若想清空某项,不能用 $request->session('user', null),这无效;必须用 Session::delete('user')
判断与清除Session状态
Session::has('auth_token') 比 if (Session::get('auth_token') !== null) 更可靠,因为后者在值为0或空字符串时会误判为不存在
Session::clear() 清空全部会话数据,【这不是 Session::clear('') —— 后者是无效写法】
session('?cart') 是助手函数写法,等效于 Session::has('cart'),但仅限模板或简单逻辑中使用,控制器内建议统一用门面类
立即学习“PHP免费学习笔记(深入)”;
配置Cookie持久化有效期
Cookie::set('remember_token', 'abc123', 86400) 设置1天有效期,但该值仅在当前请求生效,浏览器实际是否保留取决于 config/cookie.php 配置
打开 config/cookie.php,确认 'expire' => 86400(单位秒),且 'path' => '/'、'domain' 为空或匹配当前站点域名
【若 'secure' => true 但本地开发用http访问,cookie将无法写入浏览器】
Cookie::forever('theme', 'dark') 等效于设 expire=0,此时依赖浏览器会话周期,关闭标签页即失效
安全删除与闪存场景
用户登出时,必须同时执行 Session::clear() 和 Cookie::delete('remember_token'),不能只删一边
需要“只显示一次”的提示信息,用 Session::flash('notice', '密码已更新'),下次请求自动消失
Cookie::get('token') 返回null不代表未设置,可能因 httponly=true 导致JS无法读取,但PHP服务端仍可正常获取



















