laravel session 默认可用但需确保 session_driver 配置正确,推荐生产环境使用 redis 或 database;必须通过 laravel api 操作 session,避免直接操作 $_session;startsession 中间件顺序至关重要,api 路由需显式添加 ‘web’ 中间件;过期时间受 driver、gc、redis 策略等多因素影响。

Session 在 Laravel 里默认就可用,但得确认 driver 配置正确
Laravel 默认启用 Session,但如果你发现 session() 没反应、request()->session() 取不到数据,大概率是 SESSION_DRIVER 没配对。常见错误是本地用 file(默认),但部署到无写入权限的容器或服务器时没切到 database 或 redis。
-
config/session.php中的driver必须和.env里的SESSION_DRIVER=redis一致 -
redisdriver 要求phpredis扩展已启用,且REDIS_HOST可连;databasedriver 要求先运行php artisan session:table+php artisan migrate -
Arraydriver 仅用于测试,每次请求重置,上线千万别留着
存取 Session 数据别直接用 $_SESSION,走 Laravel 的 API
手动操作 $_SESSION 会绕过 Laravel 的加密、序列化、垃圾回收逻辑,导致 flash 失效、跨请求丢失,甚至报 Serialization of closure is not allowed 错误。
- 存:用
session(['key' => 'value'])或request()->session()->put('key', 'value') - 取:用
session('key')或session('key', 'default')(带默认值更安全) - 删:用
session()->forget('key'),不是unset($_SESSION['key']) - 闪存(flash)必须用
session()->flash('key', 'value'),它只在下一次请求有效,别用put模拟
中间件顺序错乱会导致 Session 写不进响应
Session 写入依赖 StartSession 中间件——它负责从请求中解密并挂载 session 实例,并在响应结束前把变更写回存储。如果自定义中间件放在它前面且提前返回响应(比如权限拦截 throw 了异常),Session 就不会被保存。
- 检查
app/http/Kernel.php中$middlewareGroups['web'],确保IlluminateSessionMiddlewareStartSession::class在你自定义中间件之前 - 不要在中间件里调用
exit或die;要用return response()->...->withcookie(...)等标准方式终止流程 - API 路由默认不加载
StartSession,如果需要 session(比如调试用),得显式加middleware('web')
Session 过期时间不只看 lifetime,还要看 driver 的 GC 和配置
SESSION_LIFETIME=120 表示「闲置 120 分钟后过期」,但实际失效时间还受 driver 影响。比如 file driver 的 GC(垃圾回收)概率触发,可能让 session 提前消失;redis 则严格按 TTL,但若 Redis 自身设置了 maxmemory-policy=volatile-lru,也可能被挤掉。
- 检查
config/session.php的lifetime和expire_on_close(设为 true 时浏览器关掉就失效) -
filedriver 下,gc_maxlifetime必须 ≥lifetime,否则 PHP 自己清理掉 -
redisdriver 不受 PHP GC 影响,但要确认 Redis 的timeout配置没设成 0(永久连接)导致连接堆积
Session 的生命周期管理不是单点配置的事,driver、中间件、GC、前端 Cookie 设置(比如 SameSite)全得对得上。一个地方松动,就可能表现为“刚登录就掉线”或者“刷新后数据没了”。