Laravel Session 驱动配置必须匹配实际环境:本地开发用 file 驱动没问题,但上线后若用 redis 或 database 驱动却没配好,Session 会静默失效——用户反复登录、Auth::check() 总返回 false,但毫无报错提示。

Session 驱动配置必须匹配实际环境
本地开发用 file 驱动没问题,但上线后若用 redis 或 database 驱动却没配好,Session 会静默失效——用户反复登录、Auth::check() 总返回 false,但毫无报错提示。
- 检查
.env中SESSION_DRIVER是否与实际服务一致(如 Redis 需确保REDIS_HOST可达,且phpredis扩展已启用) -
database驱动需提前运行php artisan session:table并执行迁移,否则写入失败且不抛异常 - 使用
array驱动仅限测试,它不持久化,每次请求都是新会话,Auth登录后立刻丢失
Session ID 不刷新?检查中间件顺序和启动时机
Laravel 5.5 的 StartSession 中间件必须在路由匹配后、控制器执行前触发;如果自定义中间件提前终止了请求(比如权限校验里直接 return),Session 就不会写入或更新。
- 确认
app/Http/Kernel.php中StartSession::class在$middlewareGroups['web']里,且位置靠前(不能在TrimStrings或自定义中间件之后) - 避免在中间件中调用
session()->regenerate()多次——Laravel 默认已在登录成功后自动刷新,重复调用会导致 ID 频繁变更,前端 Cookie 同步滞后 - AJAX 请求若未携带
X-XSRF-TOKEN或未设置withCredentials: true,跨域时 Session ID 不会被发送,Auth::user()为null
Session 数据被截断?注意 driver 存储上限
用 file 驱动时单个 Session 文件大小无硬限制,但 redis 和 database 驱动受底层约束:Redis 默认单 value 最大 512MB(实际很少用到),而 MySQL 的 text 字段最多 64KB——存大量数据(如用户权限树、缓存的订单列表)容易被 silently 截断。
- 查看
session表中payload字段类型:TEXT改为MEDIUMTEXT可支持约 16MB - 避免在 Session 中存对象实例或闭包,序列化后体积膨胀快,且反序列化可能失败;改用存 ID,按需查库
- 使用
session()->put('key', $value)前可先strlen(serialize($value))估算大小,超 50KB 就该警惕
Session 过期时间不生效?别只改 SESSION_LIFETIME
SESSION_LIFETIME 控制的是“空闲过期”,即最后一次活动后多少分钟销毁;但真正决定会话最长存活期的是底层驱动的 TTL 设置,两者不一致就会出现「明明设了 120 分钟,却 30 分钟就掉线」。
- Redis 驱动下,还需确认
config/session.php中'ttl' => env('SESSION_TTL', null)是否为空——若为null,则完全依赖 Redis 自身配置,而非SESSION_LIFETIME - PHP 的
session.gc_maxlifetime(通过php.ini或ini_set())也会影响file驱动,必须 ≥SESSION_LIFETIME - 浏览器 Cookie 的
expires时间由 Laravel 自动计算,但若服务器时间不准(比如 Docker 容器没同步宿主机时间),会导致 Cookie 提前过期


















