必须在Symfony中配置RedisAdapter接管会话读写以实现多服务器共享,需确保Redis服务运行、PHP启用redis扩展(非predis),在framework.yaml设handler_id为session.handler.redis,并在services.yaml定义该服务,DSN须指定非0数据库编号(如/1)避免与缓存冲突,最后用redis-cli验证key写入。

要在Symfony项目中把Redis用作会话存储,必须绕过默认的文件或PHP原生session handler,改用RedisAdapter接管会话读写——否则多台服务器部署时会话无法共享,用户反复登录。
确认Redis服务已就绪
先确保Redis服务正在运行且可被PHP进程访问。执行redis-cli ping返回PONG才算通过;若用Docker部署,宿主机PHP需连host.docker.internal:6379而非localhost:6379,否则连接将超时失败。
检查PHP是否启用redis扩展:运行php -m | grep redis,无输出则需安装扩展,【不能用predis替代】,因为Symfony会话组件不兼容predis的SessionHandler实现。
配置framework.yaml启用Redis会话处理器
打开config/packages/framework.yaml,在session:节点下添加handler_id并指向自定义服务:
```yaml
framework:
session:
handler_id: 'session.handler.redis'
```
这一步告诉Symfony放弃默认session.handler.native,改用你即将定义的Redis处理器。
定义Redis会话处理器服务
在config/services.yaml中声明服务:
```yaml
services:
session.handler.redis:
class: Symfony\Component\Cache\Adapter\RedisAdapter
arguments:
- '%env(REDIS_DSN)%'
- 'session'
public: false
```
注意第二参数'session'是缓存池前缀,避免与应用缓存key冲突;DSN必须带数据库编号(如redis://localhost:6379/1),【不要用DB 0】,因Symfony默认缓存池也用DB 0,混用会导致会话数据被cache:clear误删。
若Redis需密码认证,DSN格式为redis://default:yourpass@127.0.0.1:6379/1,用户名default不可省略。
验证会话是否写入Redis
启动应用后,执行redis-cli -n 1 keys "session:*",应能看到类似session:abc123...的key;再访问任意页面,刷新后执行redis-cli -n 1 get "session:abc123...",返回非空字符串即表示会话已成功存入Redis。
若返回(nil),检查phpinfo()中session.save_handler是否仍为files——说明handler_id未生效,需确认YAML缩进是否正确、服务是否被正确加载。


















