必须指定redis存储并显式配置连接参数:在config/session.php设'type'=>'redis'、'store'=>'redis',config/cache.php中stores.redis需填host/port/database/auth;prefix为空或统一,cookie_domain设为'.example.com'。

在ThinkPHP8中让Session数据跨请求稳定存取,必须明确指定存储位置和连接方式,不能依赖默认的file驱动——它在多服务器或子应用环境下必然失效。
启用Redis作为Session驱动
第一步:确认已安装并启用PHP redis扩展(不是predis),且Redis服务正常运行,端口6379可连通。
第二步:打开config/session.php,将type设为'redis',store设为'redis'(与cache.php中stores下的键名一致):
【'type' => 'redis', 'store' => 'redis'】
第三步:打开config/cache.php,在stores.redis配置块中填入完整连接参数:
host、port、database必须显式写出;若Redis启用了ACL密码,必须用'auth' => 'your_pass',写password字段无效;timeout建议设为3或以上,避免高并发下静默失败。
第四步:强制统一序列化方式,在config/session.php中添加'serialize' => 'php'——否则TP8默认用igbinary(若扩展启用),而原生Redis扩展可能用php序列化,两者互不兼容会导致登录后秒退。
配置Database驱动存Session
方法一:直接使用内置Db驱动
在config/session.php中设置'type' => 'db',无需额外引入类文件。
方法二:手动创建session表
执行SQL建表语句,确保字段名、类型、主键与ThinkPHP Db驱动要求完全一致:
CREATE TABLE `tb_session` ( `sess_id` VARCHAR(128) NOT NULL PRIMARY KEY, `sess_data` TEXT NOT NULL, `sess_time` INT(10) UNSIGNED NOT NULL, `sess_lifetime` INT(10) UNSIGNED NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
注意:表名必须与config/session.php中'table' => 'tb_session'保持一致,否则查询永远返回空。
多子应用共享Session的关键设置
① 所有子应用的config/session.php中'prefix'必须为空字符串或完全相同——例如www和admin都设'prefix' => '',若www写'sess_'而admin写'admin_sess_',彼此读不到对方写入的数据。
② Cookie域必须设为根域名,如'domain' => '.example.com',否则浏览器不会把Session Cookie发送给admin.example.com或api.example.com。
③ 确保所有子应用共用同一套Redis实例或同一张数据库表,且session_options中path、name等基础参数完全一致,否则PHP底层会生成不同session_id。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











