thinkphp 6 启用 redis session 驱动只需配置:将 config/session.php 中 type 设为 'redis',store 指向正确的 redis 连接名,并在 cache.php 中配好 host/port/password/database;注意 password 特殊字符需 url 编码;添加 'serialize' => 'php' 统一序列化方式(6.0.10+ 支持);unix socket 连接需用 'host' => 'unix:///path' 格式;多子域名共享 session 时 session.domain 必须设为 '.example.com'。

ThinkPHP 6 如何启用 Redis 作为 Session 驱动
直接改配置就行,不需要写新类或重写 SessionHandlerInterface —— ThinkPHP 6 内置了 redis 会话驱动,只要 Redis 扩展已安装、服务可连,配对参数就能用。
关键在 config/session.php 中修改以下几项:
-
type改为'redis' -
store指向 Redis 连接配置名(默认是'redis',对应config/cache.php里的stores.redis) - 确保
cache.php中的stores.redis配置正确(host、port、password、database 等) - 如果 Redis 有密码且含特殊字符(如
@、/),需 URL 编码后填入password字段,否则连接失败但报错不明确
为什么 session_id 不变但登录态丢失?检查 Redis 序列化方式
ThinkPHP 默认用 serialize() 存 Session 数据,而原生 PHP Redis 扩展默认用 igbinary(若启用)或 php 序列化。两者不兼容会导致反序列化失败,Session 读出来是空,表现为“登录了又跳回登录页”。
解决方法:强制统一为 PHP 原生序列化,在 config/session.php 加:
'serialize' => 'php',
注意:serialize 选项仅在 ThinkPHP 6.0.10+ 支持;低版本需手动覆盖 think\session\driver\Redis 类的 read() 和 write() 方法,加 unserialize()/serialize() 包裹。
Redis 连接超时或拒绝连接?优先排查 socket 路径与权限
本地开发常用 Unix socket 连 Redis(如 /var/run/redis/redis-server.sock),但 ThinkPHP 的 Redis 驱动默认只认 host+port,不自动识别 unixsocket 参数。
如果你在 cache.php 里写了 'path' => '/var/run/redis/redis-server.sock',它不会生效 —— 必须显式设为:
'store' => [
'redis' => [
'type' => 'redis',
'host' => 'unix:///var/run/redis/redis-server.sock',
'port' => 0,
// 其他参数...
],
],
另外确认 PHP 进程用户(如 www-data)对 socket 文件有读写权限,否则连接被拒绝,错误信息常是 Connection refused 或空响应。
多级子域名下共享 Session,domain 设置必须带点开头
比如站点跑在 admin.example.com 和 api.example.com,想共用登录态,session.php 中的 domain 不能写成 'example.com',得写成 '.example.com'(开头带点)。
否则浏览器不会把 Cookie 发给子域名,Session ID 根本传不过去。这个点漏掉,Redis 存得再稳也没用。
顺带一提:ThinkPHP 的 cookie_domain 和 session.domain 是两个配置,后者才控制 Session Cookie 的 domain 属性,别配错地方。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











