session 默认用 file 驱动;开发可用,但线上高并发易卡顿或丢数据,应切至 redis 或 database,并确保配置正确、中间件顺序合理、key 使用规范。

Session 默认用什么驱动?别直接写代码前先看 config/session.php
Laravel 的 session 驱动默认是 file,开发环境够用,但上线后高并发下容易卡住或丢数据。如果你没改过 config/session.php 里的 driver,那它就是 file —— 这不是 bug,是设计,但也是多数线上 session 失效的起点。
- 本地开发用
file没问题;上生产务必切到redis或database - 切
redis要确认REDIS_HOST和REDIS_PASSWORD在.env里配对,否则会静默 fallback 到file(不报错,但 session 不跨请求) -
database驱动需提前运行php artisan session:table+php artisan migrate,漏掉就存不进库,session()->put()看似成功,实际查不到记录
怎么安全地存用户 ID 而不是整个 User 对象?
别在 session 里存 $user 实例或 Eloquent 模型——序列化后体积大、反序列化有风险、权限变更后 session 不自动失效。Laravel 认证系统本身只存 id,你手动存也该照这个逻辑。
PHP中文网提供Laravel 13.2.0版本下载,Laravel框架 是基于 PHP 8.3+ 的高性能框架,官方推荐通过 Composer 安装。它内置 AI SDK、JSON:API Resources 及原生向量搜索,支持属性驱动开发与队列路由,大幅提升开发效率。相比旧版,13.2.0 优化了缓存 TTL 管理与实时通信,无需 Redis 即可横向扩展。作为现代 Web 开发首选,它兼顾安全与极速体验,助您快速构建企业级应用。
- 正确做法:
session(['user_id' => $user->id]),后续用User::find(session('user_id'))拉数据 - 错误做法:
session(['user' => $user]),模型带关系、访问器、原始连接句柄,可能触发意外查询或内存泄漏 - 如果真要缓存用户基础字段,用
toArray()显式截断:session(['user_data' => $user->only(['id', 'name', 'email'])])
Session 中间件顺序错了,request()->session() 就是 null
Laravel 的 session 不是全局可用的,它依赖 StartSession 中间件挂载。如果你自定义了中间件组、用了 api 路由组,或者在控制器构造函数里调 session(),大概率拿到空对象。
-
web中间件组默认包含\Illuminate\Session\Middleware\StartSession::class;api组默认没有 —— 所以Route::middleware('api')下的路由无法用 session - 控制器构造函数执行时,中间件还没跑,
$this->session或session()全是 null;必须在__invoke或具体方法里用 - 想在中间件里操作 session?确保它排在
StartSession之后,比如自定义中间件写在app/Http/Kernel.php的$middlewareGroups['web']数组里靠后位置
forget() 不生效?检查 key 是不是带点号或数组路径
session()->forget('cart.items') 看起来合理,但 Laravel 的 forget() 不支持点号路径语法(那是 pull() 和 get() 的特性),它只认一级 key。
- 错误:
session()->forget('cart.items')→ 什么也不删 - 正确:
session()->forget('cart')(删整个 cart),或用session()->put('cart', Arr::except(session('cart', []), ['items'])) - 批量删多个 key:
session()->forget(['token', 'temp_id', 'step']),传数组,别用逗号分隔字符串 - 删完立刻验证:
session()->has('key')比dd(session()->all())更轻量,避免输出敏感信息










