将 PHP 会话存储从文件系统迁移到 Redis 主要解决 session 文件锁竞争和多服务器共享问题,不能直接提升 PHP-FPM 的 pm.max_children 进程上限。适用场景为多节点部署或单节点高频率会话写入,风险边界在于 Redis 单点故障会导致会话不可用。
先说结论:Redis 会话存储优化的是会话读写 I/O 效率,而非 PHP-FPM 进程数量,适合解决会话锁等待导致的请求阻塞。
- 先定位:检查 PHP 慢日志中是否存在 session 文件锁等待记录
- 先做:安装 php-redis 扩展并修改
session.save_handler配置 - 再验证:通过并发请求测试会话写入延迟和锁竞争情况
命令速用版
修改 php.ini 或池配置文件,指定 Redis 为会话处理器:
session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6379?auth=yourpassword"
重启 PHP-FPM 服务使配置生效:
systemctl restart php-fpm
为什么会这样
默认文件会话存储使用独占锁,同一用户的并发请求会串行执行。Redis 会话存储将锁机制移至内存,减少磁盘 I/O 等待,但同一会话 ID 的并发请求仍可能受逻辑锁影响。
分步处理
1. 确认环境已安装 Redis 扩展,执行 php -m | grep redis 查看输出。
2. 编辑 PHP 配置文件,设置 session.save_handler 为 redis,填写正确的连接地址。
3. 调整 PHP-FPM 池配置 pm.max_children 根据内存容量,会话存储变更不直接改变此值。
4. 重启服务后,检查错误日志确认无连接拒绝报错。
怎么验证是否生效
创建测试脚本输出 phpinfo() 确认 Registered Streams 包含 redis。使用压测工具发送携带相同 Cookie 的并发请求,观察响应时间波动是否减小。检查 Redis 监控确认 key 写入频率符合预期。
常见坑
Redis 网络延迟高于本地文件系统,局域网外部署可能增加单次请求耗时。未配置持久化可能导致 Redis 重启后会话丢失。默认 session 锁机制在 Redis 中依然存在,需代码层面避免同一用户并发写入。
常见问题
Redis 会话存储能增加 PHP-FPM 最大进程数吗?
不能。PHP-FPM 进程数由服务器内存和 pm.max_children 配置决定,与会话存储后端无关。
Redis 宕机后会话如何处理?
默认情况下请求会报错或降级为文件存储,需配置 session 故障转移策略或确保 Redis 高可用。