必须改因多机部署时文件session失效——负载均衡导致请求分散,session文件无法共享;应改用redis或数据库存储,配置需完整包括组件定义、类替换及连接参数。

Yii2 中 session 默认存文件,为什么必须改?
默认用 FileSession 存本地磁盘,多机部署直接失效——负载均衡下用户请求分到不同服务器,session_start() 找不到对应文件,登录态秒丢。Redis 或数据库不是“更高级”,而是生产环境的底线配置。
用 Redis 存 session:三步配好不踩坑
核心是替换 session 组件类,并确保 Redis 连接稳定。别只改 class,漏掉连接参数照样报错。
- 在
config/web.php的components里定义redis组件(必须先有):'redis' => [ 'class' => 'yii\redis\Connection', 'hostname' => '127.0.0.1', 'port' => 6379, 'database' => 0, ], - 再配
session组件,关键点:类必须是yii\redis\Session,且显式指定redis实例名:'session' => [ 'class' => 'yii\redis\Session', 'redis' => 'redis', // 必须和上面 redis 组件名一致 'keyPrefix' => 'yii2_session:', // 避免和其他项目 key 冲突 ], - 确认 PHP 已装
php-redis扩展(不是predis),否则启动时抛Class 'Redis' not found
切数据库存 session:注意 Yii 版本差异
Yii2.0.x 和 2.1+ 的数据库 session 表结构不一样,直接套旧 SQL 会写失败。别信网上复制的建表语句,看自己版本文档。
- Yii 2.0.x 用
yii\web\DbSession,表字段含id(varchar 128)、data(longtext)、expire(int) - Yii 2.1+ 改用
yii\redis\Session为主推,DbSession虽保留但默认不带建表迁移,得自己跑:yii migrate/create create_session_table - 如果手动建表,
id字段必须设为主键 + 索引,否则高并发下SELECT ... FOR UPDATE锁表严重,登录页卡死
session 配置生效后,怎么验证没白配?
别只看登录是否成功——那是业务逻辑兜底了。真要确认存储层切换成功,得查底层。
- Redis 方案:连上 Redis,执行
KEYS yii2_session:*,能看到带 session ID 的 key,GET一下值是序列化字符串 - 数据库方案:登录 MySQL,查
SELECT * FROM session LIMIT 1,data字段非空且长度明显大于 100 字节(说明存了实际数据,不是空字符串) - 最简单粗暴:临时把
session组件 class 改成一个不存在的类名(如yii\web\FakeSession),刷新页面直接报错——说明配置确实在生效,不是被忽略
Redis 的 keyPrefix 和数据库表名这类细节,上线前不检查,出问题时根本想不到是它;等用户反馈“登着登着就掉了”,再回来看配置,已经绕远路了。











