thinkphp 6 默认不内置 redis 会话驱动,需手动配置 session.driver 为 'redis' 并补全 session.redis 必填项(host、port、password、select、timeout、expire),否则静默降级为 file 驱动。

ThinkPHP 6 如何启用 Redis 会话驱动
直接说结论:ThinkPHP 6 默认不内置 Redis 会话驱动,必须手动配置 session.driver 并确保 ext-redis 扩展已安装,否则会静默退化为 file 驱动,且无任何报错提示。
实操上分三步走:
- 确认 PHP 已启用
redis扩展(运行php -m | grep redis) - 在
config/session.php中将driver改为'redis' - 补全
redis连接参数,不能只留空数组 —— 否则 TP 会跳过初始化,直接 fallback 到 file
常见错误现象:改完配置后 $_SESSION 仍能写入,但换浏览器/重启服务就丢失,本质是 session 没真正走 Redis,只是在用默认的 file 驱动。
session.redis 配置项必须填哪些字段
ThinkPHP 6 的 session.redis 是一个关联数组,不是 DSN 字符串。漏掉任意一个必要字段,都会导致连接失败并静默降级。
最小可用配置(以本地 Redis 为例):
'redis' => [
'host' => '127.0.0.1',
'port' => 6379,
'password' => '',
'select' => 0,
'timeout' => 0,
'expire' => 14400,
]
关键点说明:
-
host和port必填,password为空字符串也得显式写出来(不能设为null或省略) -
select表示 Redis 数据库编号,TP 不支持用 DB 名字,只认数字 -
timeout设为0表示阻塞等待,设太小(如0.1)容易在高并发时连不上,报Redis server went away -
expire单位是秒,对应 session 生命周期,不是 Redis key 的 TTL —— TP 会在写入时自动加这个过期时间
为什么 setcookie() 正常但 session 数据没进 Redis
典型表现:浏览器能收到 PHPSESSID Cookie,$_SESSION 可读可写,但用 redis-cli keys 'think:session:*' 查不到任何 key。
根本原因不是代码问题,而是驱动未真正加载成功。ThinkPHP 在 session 驱动初始化失败时不会抛异常,而是悄悄切回 file 驱动,并继续执行 —— 你看到的 session 行为全是 file 驱动撑起来的。
排查步骤:
- 打开
app/middleware/SessionInit.php(或全局中间件中 session 初始化逻辑),加一行var_dump(class_exists(\think\session\driver\Redis::class));看是否返回true - 检查日志目录下是否有
runtime/log/*.log文件,搜索session或redis,TP 会在驱动加载失败时写 warning 日志 - 临时注释掉所有自定义 session 处理逻辑,在控制器里直接写
session('test', 'ok');,再立刻用redis-cli查 key —— 避免中间件干扰判断
Redis 会话 key 命名规则与清理风险
ThinkPHP 6 的 Redis 会话 key 格式固定为 think:session:{PHPSESSID},其中 {PHPSESSID} 是经过 URL 安全 base64 编码的原始 session_id(不含等号)。
这意味着:
- 不能用通配符批量删 key(如
redis-cli keys 'think:session*'),因为编码后的 session_id 可能含+、/,而keys命令不支持转义 - 清理过期 session 必须依赖 Redis 自身的
maxmemory-policy或定期跑脚本,TP 不提供类似session_gc()的手动清理接口 - 如果多个应用共用一个 Redis 实例,务必修改
session.prefix配置(如设为'tp6_admin:'),否则会互相覆盖 session 数据
最容易被忽略的一点:Redis 的 save 配置和 RDB/AOF 持久化策略对 session 影响极小,因为 session key 都带 TTL,但若误配了 maxmemory-policy noeviction,内存满后新 session 就会写失败,且 TP 不报错,只会让后续请求拿不到 session 数据。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











