需同步完成驱动注册、连接参数校准、前缀隔离与PHP原生会话机制关闭,任一缺失会导致缓存静默失效或登录态丢失;必须安装topthink/think-redis扩展并启用phpredis(非Predis),配置cache.php中stores.redis和session.php中redis子数组,严格区分sess:与cache:前缀,并关闭session.use_trans_sid和session.auto_start。

在ThinkPHP项目中启用Redis作为缓存后端并接管Session管理,需同步完成驱动注册、连接参数校准、前缀隔离与PHP原生会话机制关闭,任一环节缺失都会导致缓存静默失效或登录态丢失。
安装扩展与启用PHP Redis模块
第一步:执行composer require topthink/think-redis安装官方缓存扩展包。该包负责注册RedisCache驱动类,未安装则调用Cache::get()时直接抛出Driver not supported: redis异常。
第二步:运行php -m | grep redis确认输出含redis;若无结果,需编辑php.ini添加extension=redis.so(Linux/macOS)或extension=php_redis.dll(Windows),然后重启PHP-FPM或Web服务器。
注意:【必须使用phpredis扩展,predis或纯PHP实现不兼容】。ThinkPHP 6.x底层依赖phpredis的C函数接口,Predis仅在部分调试场景可用,生产环境强制要求原生扩展。
立即学习“PHP免费学习笔记(深入)”;
配置Redis缓存驱动
方法一:修改.env文件(推荐优先级最高)
CACHE_DRIVER=redis
方法二:配置config/cache.php中的stores.redis块
确保包含以下字段且类型严格匹配:'type' => 'redis'(全小写)、'host' => '127.0.0.1'、'port' => 6379、'password' => ''(空密码也须显式声明)、'select' => 0(整数,不可写"0")。
关键参数说明:timeout建议设为3而非0,避免阻塞请求;prefix默认为think:,调试时可设为''便于redis-cli keys "*"观察原始key;expire单位为秒,传null表示永不过期,传0等价于立即删除。
配置Redis Session驱动
第一步:在config/session.php中设置'driver' => 'redis',并补全'redis'子数组:
'redis' => ['host' => '127.0.0.1', 'port' => 6379, 'password' => '', 'select' => 2, 'timeout' => 60, 'prefix' => 'sess:']
第二步:关闭PHP原生Session机制——检查php.ini中session.use_trans_sid = Off和session.auto_start = Off,否则ThinkPHP写的Redis session会被$_SESSION文件驱动覆盖,出现“Redis里有key但登录态丢失”的现象。
第三步:【session与cache的Redis前缀必须分离】。若缓存配prefix => 'cache:',session就必须配prefix => 'sess:',否则FLUSHDB或KEYS cache:*会误删用户会话数据。
第四步:删除项目中任何手动调用ini_set('session.save_handler', 'files')的代码,尤其检查中间件、公共函数或启动脚本。
验证配置是否生效
① 缓存验证:命令行执行php -r "var_dump(cache('test', 'ok', 10));",再执行php -r "var_dump(cache('test'));",两次均应返回string(2) "ok"。
② Session验证:在控制器中调用session()->getHandler(),返回实例类名应为think\session\driver\Redis;同时用redis-cli执行keys sess:*,应能看到带sess:前缀的会话key。
③ 排查静默失败:若cache()返回null但无报错,立刻检查config/cache.php中default值是否与stores下定义的store键名完全一致(如写成'redis_cache'而stores里是'redis',将自动回退到file驱动)。



















