codeigniter视图缓存不更新是因服务端页面缓存(application/cache/文件)与客户端浏览器缓存双重作用:需同步清理ci缓存文件(如delete_cache())并禁用或刷新浏览器强缓存(如设置cache-control: no-cache),同时注意ci3与ci4缓存机制差异及目录写权限。

CodeIgniter 视图缓存不更新,本质是两个独立缓存层在打架:一个是 CI 自己生成的 application/cache/ 文件(服务端页面缓存),另一个是浏览器对响应内容的强缓存(客户端缓存)。只清一边,问题照旧。
确认是不是 CI 页面缓存没刷新
CI 的 $this->output->cache($n) 会把整个响应 HTML 写进 application/cache/ 目录下的文件里,过期前绝不重生成。哪怕你改了视图文件、控制器逻辑、甚至数据库数据,只要缓存没过期或没被手动删掉,用户看到的就是旧 HTML。
- 检查控制器方法里是否还留着
$this->output->cache(60)这类调用 —— 注释掉它只是“未来不缓存”,已生成的缓存文件仍有效 - 直接去服务器上查看
application/cache/目录,里面有没有对应 URI 的缓存文件(比如default_controller_index或带哈希的文件名) - 用
$this->output->delete_cache()立即删当前请求的缓存;传参如$this->output->delete_cache('/admin/dashboard')可删指定路径 - 注意:
delete_cache()必须在输出发生前执行,放在return view(...)后面就无效了
浏览器缓存让新缓存也“看不见”
即使 CI 缓存已刷新、返回了新 HTML,浏览器可能还在用它本地存的旧副本。典型表现是:硬刷(Ctrl+F5)才变新,普通 F5 不变;隐身模式下正常。
- 检查响应头里是否有
Cache-Control: max-age=31536000或Expires远期时间 —— 这是静态资源(CSS/JS/图片)常配的,但若误加到 HTML 响应头,就会锁死整页 - CI 本身默认不设强缓存头,但如果用了 Nginx/Apache 全局规则、或自己在控制器里调了
header('Cache-Control: ...'),就可能覆盖 - 开发阶段可临时加响应头禁用浏览器缓存:
header('Cache-Control: no-cache, no-store, must-revalidate');
CI4 的缓存配置和处理器影响刷新行为
CI4 把缓存从输出层移到了中间件(Filter)和独立的 Cache 配置,$this->output->cache() 已废弃。如果你用的是 CI4,老写法根本不起作用,反而让人误以为“缓存没生效”。
- 确认版本:CI3 用
$this->output->cache(n);CI4 必须配app/Config/Cache.php并启用PageCacheFilter - CI4 默认缓存时间是
$ttl = 60(秒),不是分钟 —— 设成3600才等于 1 小时 - 缓存键依赖 URI 和查询字符串;若启用了
$cacheQueryString = false(默认),那/list?page=2和/list?page=3会被当成同一个缓存键,导致翻页错乱 - 换用
RedisHandler时,delete_cache()不再管用,得用cache()->delete('key')或直接清 Redis
最易忽略的权限与路径陷阱
application/cache/ 目录不可写,CI 会静默失败:不报错、不生成缓存、也不提示 —— 表现就是“我以为开了缓存,其实压根没存”。同样,CI4 的 WRITEPATH . 'cache/'(通常是 writable/cache/)如果权限不对,缓存写入也会丢弃。
- Linux 下运行
ls -ld application/cache/,确保 web 用户(如 www-data)有写权限;必要时chmod 755 application/cache - CI4 中检查
app/Config/Cache.php里的$file['storePath']是否指向真实可写路径,别漏掉writable/前缀 - CI3 的缓存文件名是 URI 的 MD5 哈希,CI4 则更复杂(含主机、协议、查询参数等),所以不能靠“删光 cache 目录”来暴力清理 —— 可能删掉别的缓存,也可能删不干净











