ThinkPHP的Session驱动配置位置取决于版本:TP6在config/app.php的'session'数组中,TP5.1+在config/session.php;关键项为'type'(必填)、'prefix'(建议)、'host'/'path'(按驱动选填)。

Session驱动配置项写在哪
ThinkPHP 的 Session 驱动配置不在 session.php 单独文件里,而是直接塞进 config/app.php(TP6)或 config/session.php(TP5.1+),具体看版本。TP6 默认把 session 配置扁平化进 app.php 的 'session' 数组里;TP5.1 起才拆出独立配置文件。别翻半天找不到,先确认你用的是 TP5 还是 TP6。
关键配置项就三个:'type'(必须)、'prefix'(建议设)、'host'/'path'(按驱动选填)。
-
'type' => 'redis'或'type' => 'file'—— 这是开关,其他参数全靠它触发 -
'prefix' => 'think_'—— Redis 模式下避免 key 冲突,文件模式下影响 session 文件名前缀 - Redis 模式需补全:
'host'、'port'、'password'(如有)、'select'(库号,默认 0) - 文件模式要注意:
'path'必须是绝对路径且 Web 进程有写权限,比如/runtime/session,别写相对路径
Redis驱动连不上常见报错和解法
配完 'type' => 'redis' 启动就报 Class 'Redis' not found 或 Connection refused,基本就两类问题:扩展没装,或者配置指向了错的地址。
-
Class 'Redis' not found:PHP 缺 Redis 扩展,不是 composer require thinkphp/think-redis。运行php -m | grep redis看有没有输出;没输出就装扩展(Linux 用apt install php-redis或编译安装,Windows 改php.ini加extension=php_redis.dll) -
Connection refused:检查'host'和'port'是否和redis-server实际监听一致;Docker 环境别写localhost,得用容器名如redis - 密码不为空但没配
'password':会卡在 AUTH 阶段,日志里可能只显示“连接超时”,实际是认证失败 - Redis 6+ 默认 requirepass + protected-mode on:如果没开密码,又开了 protected-mode,本地回环外连不上,临时调试可改
redis.conf关掉protected-mode no
文件驱动为什么突然失效
看着配置是 'type' => 'file',但 session_start() 后死活不写文件,或者写进去了但下次读不出来——大概率是路径或权限断了。
立即学习“PHP免费学习笔记(深入)”;
-
'path'值末尾没加斜杠,比如写了/runtime/session没写/runtime/session/,ThinkPHP 会拼出/runtime/session/sess_xxx,但部分系统对无尾斜杠路径解析异常 -
/runtime/session目录不存在,或 PHP 进程(如 www-data、nginx、apache 用户)没写权限,用ls -ld /runtime/session看 owner 和 chmod - Apache + mod_php 下,
session.save_path被 php.ini 强制覆盖,ThinkPHP 配置无效;得在虚拟主机里加php_admin_value session.save_path "/absolute/path/to/session" - CLI 模式跑定时任务时用了 session,但 CLI 的
session.save_path和 Web 不同,容易误以为“文件驱动坏了”,其实是两个环境
Redis和文件驱动切换时要注意的兼容点
别以为改个 'type' 就能无缝切——session 数据格式、过期逻辑、并发行为全不一样,线上切之前必须清旧数据。
- Redis 驱动默认用
setex存键,TTL 精确到秒;文件驱动靠文件修改时间 +gc_maxlifetime,实际过期有延迟 - Redis 模式下,
session_destroy()是删 key;文件模式下是删文件,但文件残留可能被 gc 清理,中间有空窗 - 从文件切 Redis:必须手动清空原
session.path下所有sess_*文件,否则老 session 还能被读出来(只要没过期) - 从 Redis 切文件:Redis 里的 key 不会自动导出,切完等于全量登出,用户得重新登录
- TP6 的
think-session包支持多驱动共存,但别在同一个请求里混用,Session::driver('redis')是运行时切,不是配置级切换
真正麻烦的不是怎么配,是切的时候没人记得清 Redis 里还挂着多少未过期的老 session,或者文件目录权限在部署后被 CI 覆盖重置了一次。



















