PHP 8 使用 Redis 存储会话数据需配置 session.save_handler=redis 和 session.save_path,推荐修改 php.ini 并重启服务;无法修改时可用 ini_set 动态设置,且必须禁用 PHP 垃圾回收以避免误删 session。

PHP 8 使用 Redis 存储会话数据,核心是让 session_start() 背后的会话管理器把数据写进 Redis,而不是默认的本地文件。这在单机部署时能提升读写速度,在集群或负载均衡环境下更是必须——否则用户可能在 A 服务器登录,B 服务器却查不到 session,直接掉登录态。
修改 php.ini 配置(推荐,全局生效)
这是最直接的方式,适用于能控制 PHP 运行环境的场景(如自建服务器、Docker 容器):
- 打开你的
php.ini(注意:FPM 模式下通常是/etc/php/8.x/fpm/php.ini,CLI 下是另一个路径) - 设置两项关键配置:
session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6379?auth=your_password&database=1"
-
auth=xxx是可选的,仅当 Redis 启用 ACL 或 requirepass 时添加;密码含特殊字符需 URL 编码 -
database=1建议显式指定(不要用默认 0),与缓存数据物理隔离,避免 key 冲突 - 如果 Redis 运行在非标准端口(比如 6380),请同步改
6379为对应值
改完后务必重启 PHP-FPM 或 Web 服务(如 sudo systemctl restart php8.x-fpm),否则不生效。
立即学习“PHP免费学习笔记(深入)”;
代码中动态设置(适合共享主机或无法改配置的环境)
若没有权限修改 php.ini,可在项目入口(如 index.php 最开头)手动覆盖:
- 必须在
session_start()之前调用 - 示例写法:
ini_set('session.save_handler', 'redis');
ini_set('session.save_path', 'tcp://127.0.0.1:6379?auth=123456&database=1');
ini_set('session.gc_maxlifetime', 0); // 禁用 PHP 自带 GC,防止误删 Redis 中的 session
-
session.gc_maxlifetime = 0很关键:Redis 本身靠 TTL 自动过期,PHP 的垃圾回收机制反而会随机扫库删 key,导致用户莫名登出 - 确保
session_start()在这些ini_set之后执行
验证 Redis 中是否真存了 session
别只看页面没报错就以为成功。最可靠方式是直连 Redis 查看:
- 用命令行连接:
redis-cli -h 127.0.0.1 -p 6379 -a your_password - 执行:
KEYS PHPREDIS_SESSION*(注意大小写,phpredis 默认前缀是这个) - 如果返回类似
"PHPREDIS_SESSION:abc123xyz"的 key,再执行GET "PHPREDIS_SESSION:abc123xyz"能看到序列化后的 session 数据,说明已生效 - 如果返回空数组,说明配置未命中,检查 host/port/auth/database 是否完全匹配
ThinkPHP 8 用户特别注意
TP8 不走 PHP 原生 session 配置,必须单独配 config/session.php:
- 不能只写
'type' => 'redis',必须补全'store'数组 - 正确示例:
'type' => 'redis',
'store' => [
'host' => '127.0.0.1',
'port' => 6379,
'database' => 1,
'auth' => 'your_password'
],
'expire' => 3600
- 同样要禁用 GC:
ini_set('session.gc_probability', 0);放在应用启动早期 - cache 和 session 强烈建议用不同 database(如 cache=0,session=1),比加 prefix 更安全



















