必须将 session.save_handler 设为 redis,否则即使配置了 redis 地址仍走本地 files;同时生产环境需开启 session.cookie_secure = On 且确保 redis 扩展已启用并兼容。

session.save_handler 改成 redis
PHP 默认用 files 存 session,分布式下必须换存储引擎。直接改 php.ini 里的 session.save_handler 为 redis,否则所有节点还是各自写本地文件,根本不同步。
常见错误:只改了 session.save_path 却漏掉 session.save_handler,结果 session 看似连上了 Redis,实际还是走 files —— 因为 handler 没切过去,save_path 的 redis 地址压根不生效。
session.save_handler = redis-
session.save_path = "tcp://127.0.0.1:6379?database=0"(支持带参数的连接串) - 如果用密码,写成
tcp://:yourpass@127.0.0.1:6379 - Unix socket 路径写法:
unix:///var/run/redis.sock?database=0
确认 redis 扩展已启用且版本兼容
不是装了 Redis 就行,PHP 必须有 redis 扩展(不是 phpredis 的旧名混淆),且版本 ≥ 5.3.2(对应 PHP 7.4+)才完整支持 session handler 的连接参数和超时控制。
检查方法:运行 php -m | grep redis;若无输出,说明扩展没启用或没编译进去。Docker 环境常漏掉 docker-php-ext-enable redis 这一步。
立即学习“PHP免费学习笔记(深入)”;
- PHP 8.0+ 推荐用
pecl install redis+ 启用extension=redis.so - 避免混用
phpredis和redis扩展名(新版统一叫redis) - 扩展启用后,
session_start()才会真正走 Redis 读写,否则降级到 files 并静默失败
session.cookie_secure 和 session.cookie_httponly 要按线上环境设对
HTTP → HTTPS 线上部署后,session.cookie_secure 必须设为 On,否则浏览器拒绝发送 Cookie,用户反复登录;但开发环境若没配 HTTPS,开这个会导致 session_id 不传,死循环重定向。
这个配置和 Redis 无关,但和 session 是否“可用”强相关——很多人调通 Redis 后仍登不上,卡在这儿。
-
session.cookie_secure = On(生产环境强制) -
session.cookie_httponly = On(防 XSS 窃取 session_id) -
session.cookie_samesite = "Lax"或"Strict",避免 CSRF,现代浏览器要求明确值 - 别用
session_set_cookie_params()动态覆盖,容易被后续代码绕过
Redis 连接稳定性要加 failover 和超时
线上 Redis 单点挂掉,PHP 默认会阻塞几秒再报错,导致整个页面卡住。必须显式设连接与读写超时,且建议用哨兵或集群地址而非固定 IP。
仅靠 session.save_path 写死一个 IP,扩容或故障转移时得改所有 PHP 配置,运维成本高。
- 在
php.ini加:redis.session.locking_enabled = 0(关闭锁,降低 Redis 压力;PHP 7.4+ 默认关) - 超时设置(需 php-redis ≥ 5.3.4):
redis.session.connect_timeout = 1000(毫秒) - 推荐用连接池或代理层(如 twemproxy、redis-exporter + DNS 轮询),而不是让 PHP 直连多个节点
- 务必测试断网场景:停掉 Redis,看 PHP 是否快速返回错误页,而不是白屏 5 秒
session.save_handler 漏配,以及线上 HTTPS 下 cookie_secure 没开 —— 这俩一错,Redis 再稳也白搭。











