必须将 sess_driver 设为 redishandler 并配置正确 dsn,启用 php-redis 扩展,验证 redis 连通性与密钥强度,否则会静默回退到文件驱动。

sess_driver 必须设为 redis,否则会话仍走文件或数据库,起不到高并发优化作用。
确认 Redis 服务已就绪且 PHP 扩展可用
CI4 不自带 Redis 驱动,它依赖 PHP 的 redis 扩展(不是 phpredis 别名,而是扩展名本身)。运行 php -m | grep redis 确认已启用。若无输出,需安装扩展:sudo apt install php-redis(Ubuntu/Debian)或通过 pecl 安装。同时确保 Redis 服务在 127.0.0.1:6379 可达,密码为空或与配置一致。
修改 app/Config/Session.php 配置驱动与连接参数
CI4 的会话配置集中在 app/Config/Session.php,关键项必须显式设置:
-
$sessionDriver = 'RedisHandler';—— 注意不是字符串'redis',而是类名RedisHandler(CI4 内置,大小写敏感) -
$sessionSavePath = 'tcp://127.0.0.1:6379?database=0';—— 必须用 DSN 格式;若 Redis 有密码,加password=yourpass -
$sessionMatchIP = false;—— 生产环境建议关掉,否则负载均衡下 IP 变更会导致会话丢失 -
$sessionTimeToUpdate = 300;—— 建议调小(默认 300 秒),避免高并发时大量 session write 竞争
不要动 $sessionCookieName 或 $sessionExpiration 来“凑性能”,它们影响的是 Cookie 生命周期,和 Redis 吞吐无关。
验证会话是否真正走 Redis 而非 fallback 到 files
CI4 在 Redis 连接失败时会静默 fallback 到 files 驱动,不报错也不警告——这是最常被忽略的坑。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 手动测试连接:
redis-cli -h 127.0.0.1 -p 6379 ping应返回PONG - 在控制器中写一段调试代码:
$this->session->set_userdata('test_key', 'test_val');,然后用redis-cli keys 'ci_session*'查看是否有 key 写入 - 检查日志:CI4 不记录会话驱动切换,但错误会出现在
writable/logs/里,关键词是RedisHandler::open或Connection refused
如果 keys 'ci_session*' 无结果,大概率是 $sessionSavePath 格式错(比如漏了 tcp://)或 Redis 权限/防火墙拦截。
生产环境必须关闭 session.auto_start 并确认加密密钥有效
CI4 会话数据默认加密,若 app/Config/App.php 中的 $encryptionKey 为空或弱(如 'abc123'),Redis 里存的会是明文乱码,后续读取失败,又 fallback 回 files。
- 生成强密钥:
openssl rand -base64 32,填入$encryptionKey - 确认
php.ini中session.auto_start = 0,否则 CI4 的 Session 初始化会被绕过 - 若使用 Redis Sentinel 或集群,
$sessionSavePath不支持,得换自定义 Handler——CI4 官方没提供,别硬套 DSN
Redis 存会话真正的瓶颈不在配置,而在 session lock:CI4 默认开启 session locking,同一会话 ID 的并发请求会串行化。高交互页面(如轮询、多 tab 操作)要关掉 $sessionRegenerateDestroy = false 并评估是否禁用锁(需改写 RedisHandler 的 write 方法)。










