ci3的cache_file驱动默认忽略$config['cache_path'],硬编码路径为apppath.'cache/';需通过扩展类重写$_cache_path逻辑才能生效,且数据库缓存路径由$db'default'单独控制。

不能直接改 config.php 里的 $config['cache_path'] 就生效 —— CI3 的文件缓存驱动(Cache_file)默认根本不读这个配置项。
为什么 $config['cache_path'] 在 CI3 里基本没用
CI3 的 Cache_file 类在构造时硬编码了缓存路径:APPPATH . 'cache/',完全忽略 $config['cache_path']。哪怕你在 config.php 里写了 $config['cache_path'] = '/tmp/ci_cache';,它也不会去读。
这个设计导致两个后果:
- 你必须手动确保
application/cache/目录存在且可写,否则缓存直接失败 - 想换路径,只能靠扩展类或替换核心文件,没有“开关式”配置
修改缓存路径的两种可靠方式
推荐优先使用「扩展类」方式,它不碰系统文件、升级安全、逻辑清晰。
- 创建目录:
application/libraries/Cache/drivers/(注意层级) - 新建文件:
application/libraries/Cache/drivers/Cache_file.php - 内容继承原类,并重写
_cache_path初始化逻辑:
<?php class CI_Cache_file extends CI_Driver
{
protected $_cache_path;
public function __construct()
{
// 读取 config.php 中的 $config['cache_path']
$CI =& get_instance();
$CI->load->config('config');
$path = $CI->config->item('cache_path');
if (empty($path))
{
$this->_cache_path = APPPATH . 'cache/';
}
else
{
$this->_cache_path = rtrim($path, '/') . '/';
}
// 确保目录存在且可写
if (!is_dir($this->_cache_path))
{
@mkdir($this->_cache_path, 0755, TRUE);
}
}
}
然后在 config.php 中设置:$config['cache_path'] = '/var/tmp/ci3_cache';
⚠️ 注意:Cache_file.php 必须放在 application/libraries/Cache/drivers/ 下,且类名必须是 CI_Cache_file(不是 MY_Cache_file),否则 CI3 的 driver 加载机制找不到它。
数据库查询缓存路径是另一套逻辑
如果你还启用了数据库查询缓存($db['default']['cache_on'] = TRUE),它的路径由 $db['default']['cachedir'] 控制,和页面缓存、Cache_file 驱动完全无关。
- 必须是绝对路径,比如:
$db['default']['cachedir'] = APPPATH . 'cache/db/'; - 该目录需手动创建并赋予写权限,CI 不会自动建
- 它和
output->cache()生成的 HTML 缓存文件互不干扰,各自独立存放
真正容易被忽略的是:CI3 同时存在三套缓存路径(页面缓存、Cache_file 驱动、数据库查询缓存),它们各自读各自的配置、走各自的初始化流程。改错一个地方,其他两处可能还在往旧目录写文件,导致你以为“改成功了”,其实只是部分生效。











