TP5.1升级TP6/TP8后Session存Redis失败主因是框架机制变更:TP5.1在config/session.php配'type'=>'redis'及'redis_host'等键,TP6/TP8须在config/app.php的'session'数组中配置'type'=>'redis'和'redis_config'=>['hostname'=>'127.0.0.1','hostport'=>6379,'password'=>'xxx'],且必须安装topthink/think-session扩展,否则静默降级为file驱动。

TP5.1 老项目升级(尤其是升到 TP6 或 TP8)后,Session 存 Redis 失败,不是配置“写错了”,而是框架底层机制变了——旧写法在新版本里直接被忽略或报错。修复核心是三点:驱动加载方式、Redis 连接参数结构、Session 初始化时机。
确认你用的是哪个版本,再决定改哪份配置
TP5.1 的 Session 配置文件是 config/session.php;TP6/TP8 则统一收口到 config/app.php 中的 'session' 数组。别在 TP6 里还去改 session.php,框架根本不读它。
- TP5.1:改
config/session.php,关键项是'type' => 'redis',并配套写'redis_host'、'redis_port'等键(注意不是host) - TP6+:改
config/app.php,在'session'数组里设'type' => 'redis',同时必须声明'redis_config' => ['hostname' => '127.0.0.1', 'hostport' => 6379, 'password' => 'xxx'](注意键名是hostname和hostport,不是host/port)
装对扩展,配对驱动,别让框架悄悄退回到 file
TP6 起,Redis Session 驱动不再是内置的,必须单独安装 topthink/think-session 扩展。没装这个包,哪怕配置全对,也会静默降级为 file 驱动,日志里还不报错。
使用 Playwright 为 jimeng.jianying.com 管理浏览器会话,导入 cookies/localStorage 以自动化视频生成工作流,支持图片上传等功能
- 执行
composer require topthink/think-session - TP5.1 是内置驱动,但依赖 PHP 的 redis 扩展(
php-redis),运行php -m | grep redis确认已启用 - TP6/TP8 若用了
cache的 Redis 配置,不能直接复用给 session ——session.redis_config必须单独声明,不继承 cache 的集群或主从逻辑
密码、序列化、连接模式,一个都不能漏
Redis 密码没生效?数据读出来是 false?连接超时却无明确报错?大概率卡在这几个细节上。
- TP5.1 用
REDIS_AUTH常量传密码;TP6/TP8 必须在redis_config数组里显式写'password' => 'xxx'(TP8 还支持'auth' => 'xxx',适配 ACL) - 如果 Redis 数据是 TP5.1 写入的(JSON 格式),TP6+ 默认用
serialize()读,会返回 false —— 在 session 配置中加'serializer' => \think\session\serializer\PhpSerializer::class可兼容 - Docker 或远程环境别写
localhost,改用容器名或真实 IP;Redis 6+ 开了protected-mode yes且没设密码时,本地回环外连不上,临时可关 protected-mode
验证码、登录态失效?先验证 Session 是否真在 Redis 里存住了
很多问题表面是验证码校验失败、用户反复登出,根源其实是 Session 根本没写进 Redis,还在用 file 驱动兜底。快速验证方法:
- 用
redis-cli连上 Redis,执行keys think_session*,看有没有 key 写入 - 在控制器里加一行
dump(\think\facade\Session::getId());,确认 session_id 生成正常 - 检查是否漏了启动环节:TP6 要求中间件或手动调
session_start(),否则 facade 不生效










