session驱动配置在config/session.php中将driver设为'redis';redis连接参数填在redis子数组,注意password不能为空字符串、select需确认可用、expire单位为秒;登录后session未进redis需检查session.name、cookie传输及cors配置。

Session驱动配置在哪改?session.driver 必须设为 redis
ThinkPHP 6.x 中 Session 驱动配置统一放在 config/session.php,关键项是 driver。不改这里,其他 Redis 配置全无效。
常见错误是只配了 Redis 连接参数却忘了改驱动,结果还是走的 file 默认方式,日志里也看不出报错,只是不生效。
-
driver必须显式设为'redis'(字符串,不是数组或类名) - 如果用了多应用模式,每个应用需单独配自己的
config/session.php - 注意:TP6.1+ 支持
redis_cluster驱动,但普通单节点 Redis 请坚持用redis
Redis 连接参数怎么填?重点看 redis.host 和 redis.password
Session 的 Redis 配置不是独立文件,而是嵌套在 session.php 的 redis 子数组里,字段名和 think-redis 扩展一致,但不自动复用其配置。
典型配置段:
'redis' => [
'host' => '127.0.0.1',
'port' => 6379,
'password' => '',
'select' => 0,
'timeout' => 0,
'expire' => 7200,
],
容易踩的坑:
-
password为空字符串时不能省略,必须写'';若 Redis 开了密码但这里留空,连接会静默失败,Session 写不进 Redis -
select是数据库编号,默认 0,TP 不会自动创建 DB,务必确认 Redis 实例中该 DB 可用(redis-cli -n 2 ping测试) -
expire单位是秒,对应 Session 生命周期,它和session.max_lifetime共同起作用,建议两者一致
为什么登录后 Session 没进 Redis?检查 session.name 和 Cookie 设置
即使驱动和 Redis 连接都对了,Session 数据仍可能没存进去——常见原因是 PHP 层未真正启动 Session,或客户端没带有效 Cookie。
ThinkPHP 的 Session 初始化依赖 session.name 和运行时环境:
-
session.name默认是PHPSESSID,但若 Nginx/Apache 做了 Header 过滤(如移除了Set-Cookie),Redis 里就永远为空 - CLI 环境或异步任务中调用
session_start()无效,TP 的 Session 组件默认跳过 CLI,别在命令行测 Redis Session - 前端请求带了
withCredentials: true但后端没配 CORS 头(Access-Control-Allow-Origin不能为*),Cookie 无法持久化,Redis 自然收不到新 Session
Redis 存的是什么?键名格式是 think:session:{id}
直接连 Redis 查数据时,发现 key 名不是裸 ID,而是带前缀的。这是 TP 的默认行为,由 redis.prefix 控制(默认值 think:session:)。
这个前缀影响实际运维:
- 用
redis-cli keys "think:session:*"可扫描当前所有 Session,但生产环境慎用,O(n) 复杂度可能卡主从同步 - 如果和其他系统共用 Redis,建议改
redis.prefix避免 key 冲突,比如设为tp6:admin:session: - Session 数据是 PHP
serialize()后的字符串,非 JSON,别用 redis-insight 直接编辑,容易损坏结构
Redis 存 Session 看似简单,但每层都有隐性依赖:PHP 的 session 模块是否启用、Web 服务器是否透传 Cookie、Redis 实例权限与网络连通性、TP 配置是否被运行时动态覆盖……漏掉任何一环,都会表现为“配置写了却没效果”。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











