ci4缓存配置以app/config/cache.php为准,.env中cache_driver等设置无效;修改后需同步更新cache.php、清理对应缓存介质(file删writable/cache/,redis用flushdb)、验证读写通路。

CodeIgniter 4 的 .env 配置修改后,手动清缓存却“不生效”,根本原因不是缓存没删掉,而是 CI4 并不从 .env 读取运行时缓存配置 —— 它只在应用启动时加载一次环境变量,且缓存机制本身与 .env 中的缓存设置(如 cache.driver)无实时联动。
CI4 的 .env 不控制运行时缓存行为
CI4 的 .env 文件主要用于初始化环境常量(如 app.baseURL、database.default.hostname),但缓存驱动类型(file/redis/apcu)和参数由 app/Config/Cache.php 硬编码决定,而非动态读取 .env。即使你在 .env 里写了 CACHE_DRIVER=redis,CI4 默认也不会自动识别并切换——它只认 Cache.php 中 $driver 属性的值。
-
Cache.php是唯一生效的缓存配置入口,.env中同名键不会覆盖它 - 改
.env后不清app/Cache/或writable/cache/,旧缓存文件仍可能被复用 - 若使用 Redis/Apcu,还需确认服务是否运行、连接是否可达,这和
.env无关
清缓存操作本身有局限性
调用 $this->cache->clean() 或删除 writable/cache/ 下文件,只影响缓存驱动存储的数据,不会重载或刷新 CI4 的配置类。比如你改了 Cache.php 里的 $backupDriver,不重启 PHP 进程或重载 autoloader,新配置就不会生效。
-
$this->cache->clean()清的是当前驱动中的数据,不是配置 - 删除
writable/cache/只对file驱动有效;Redis 缓存得用FLUSHDB或$this->cache->redis()->flushDB() - CI4 没有类似 Laravel 的
config:clear命令,配置变更必须靠代码热更或服务重启
真正需要检查的三个地方
当发现“改了配置 + 清了缓存 + 还是旧结果”,应按顺序排查:
- 确认
app/Config/Cache.php中的$driver、$backupDriver和$handlers是否匹配预期(例如设为'redis'就必须已启用 Redis 扩展) - 检查
writable/cache/目录权限是否可写,否则file驱动会静默失败,退回到无缓存状态 - 验证缓存是否真的被写入:在控制器中加一行
log_message('debug', 'Cache hit: '.($this->cache->get('test') ? 'yes' : 'no'));,再手动$this->cache->save('test', 'ok', 300)测试读写通路
CI4 的缓存设计是显式、轻量、低耦合的,它不试图用 .env 统管一切。改配置 → 改 Cache.php → 清对应缓存介质 → 验证读写通路,这个链路才是可靠的。指望改个 .env 就让缓存自动切换,反而容易卡在中间环节。











