ThinkPHP 8.0 切换 Redis 存储 session 必须在 config/session.php 中显式配置完整 store 参数并禁用 PHP 原生 GC,否则静默降级为文件存储导致登出;需硬编码 host/port/database/auth 等,且通过 ping 和 KEYS 验证生效。

ThinkPHP 8.0 将 session 存储切换到 Redis,不能只改 .env 或只设类型,必须在配置文件中显式填全连接参数,并禁用 PHP 原生垃圾回收,否则会静默降级为文件存储,导致登录后刷新掉线等隐蔽问题。
必须修改 config/session.php
TP8 不读取 .env 中的 REDIS_HOST 等变量,所有 Redis 连接参数必须硬编码写进 config/session.php 的 store 数组里:
- type 必须设为 'redis'
-
store 数组不能留空或缺失,否则运行时报错:
Call to a member function setOptions() on null - 完整示例(含 ACL 密码):
'type' => 'redis', 'store' => [ 'host' => '127.0.0.1', 'port' => 6379, 'database' => 1, 'auth' => 'your_password', // Redis ≥6.0 启用 ACL 时用 auth;传统 requirepass 模式用 password 'timeout' => 3.0, 'prefix' => 'sess:', ] -
database建议设为1(与缓存用的0隔离),避免 key 冲突
禁用 PHP 原生 session 垃圾回收
Redis 自身靠 TTL 管理过期,PHP 的 GC 机制会随机扫描并误删 session key,造成用户莫名登出:
由 ReMe 驱动的记忆管理系统,支持跨会话记忆持久化、自动应用用户偏好以及智能上下文压缩...
- 在入口文件(如
public/index.php)最开头、session_start()之前添加:ini_set('session.gc_probability', 0); ini_set('session.gc_divisor', 1000); - 若使用 PHP-FPM 全局配置,也可在
php.ini中设session.gc_probability = 0
验证是否真正生效
别依赖页面没报错就认为成功。最快验证方式:
- 终端执行:
php think tinker - 输入:
(new \think\session\driver\Redis(config('session.store')))->handler()->ping() - 返回
+PONG表示连接通;返回false或异常,说明 host/port/auth/database 不匹配或网络不通 - 补充验证:登录后执行
redis-cli -a your_password KEYS "sess:*",应能看到类似"sess:abc123"的 key
常见失败现象与原因
以下表现基本都指向 Redis session 未真正启用:
- 登录后刷新页面变成未登录状态
-
session_id()有值,但$_SESSION为空 - 缓存用了 Redis,session 却还在写本地文件(
/tmp下出现sess_*文件) - 错误日志里有
Connection refused或NOAUTH,但程序无报错、功能照常——这是 TP8 的静默降级行为
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










