yii2多实例部署必须用redis等集中式存储替代文件session,否则用户跨节点会反复登录;需安装phpredis扩展和yii2-redis包,配置redis组件与session组件并复用连接,指定database、keyprefix和timeout,最后验证key写入与登录态一致性。

一、确认 Redis 扩展已安装并可用
确保服务器已安装 phpredis 扩展(非 predis),并在 phpinfo() 中可见;同时通过 Composer 安装 Yii2 官方 Redis 扩展:
composer require --prefer-dist yiisoft/yii2-redis- 检查
vendor/yiisoft/yii2-redis目录存在,且类yii\redis\Session可被自动加载 - 确认 Redis 服务运行正常,能被 PHP 进程访问(注意防火墙、SELinux、host 配置)
二、配置 redis 组件(复用已有连接)
在 config/main.php 或 config/web.php 的 'components' 数组中添加或复用 redis 连接:
'redis' => [
'class' => 'yii\redis\Connection',
'hostname' => '192.168.1.100', // 生产环境建议用内网 IP
'port' => 6379,
'database' => 1, // 建议与 cache 分库,例如 cache 用 db 0,session 用 db 1
'password' => 'your_redis_pass', // 若启用认证
],
⚠️ 注意:database 必须明确指定,不能依赖默认值;不同应用或模块使用不同 database 可避免 key 冲突。
三、启用 Redis Session 存储
替换默认 session 组件,指向 Redis 后端:
'session' => [
'class' => 'yii\redis\Session',
'redis' => 'redis', // 指向上面定义的 redis 组件 ID(字符串名)
'keyPrefix' => 'sess:', // 可选,避免与其他应用 session key 混淆
'timeout' => 1440, // 单位:秒,与 PHP ini 中 session.gc_maxlifetime 保持一致
],
关键点说明:
-
'redis' => 'redis'表示复用 components 中名为redis的连接配置,无需重复写 hostname/port -
keyPrefix会自动加在每个 session ID 前,例如sess:abc123xyz,推荐设置 -
timeout必须 ≥ 应用中设置的session.gc_maxlifetime(通常在php.ini或ini_set()中),否则会提前失效
四、验证与注意事项
完成配置后重启 Web 服务,进行以下验证:
- 登录后查看 Redis 中是否生成带
sess:前缀的 key:redis-cli -a yourpass SELECT 1; KEYS "sess:*" - 在两个不同后端实例上访问同一页面,确认登录态持续有效(可临时在
index.php加日志输出session_id()和Yii::$app->user->isGuest) - 检查日志是否有
Failed to write session data或Connection refused类错误
常见问题提示:
- 若 session 写入失败但 Redis 命令行操作正常,检查
database是否与SELECT n不一致 - 负载均衡需开启「粘性会话(sticky session)」仅作兜底,不能替代 Redis 共享方案
- 不建议在
session组件中直接嵌套 redis 配置(如'redis'=>[...]),应统一通过组件名引用,便于复用和管理











