CI3数据库缓存不依赖cachedir,该配置实际用于文件缓存驱动;若路径含中文会导致mkdir()失败、file_put_contents()报错或静默失效,根本解决方法是将项目移至纯英文路径。

CI3(CodeIgniter 3)本身没有内置的 cachedir 配置项用于数据库——它不把数据库查询结果缓存到文件系统;你遇到的“cachedir 路径含中文导致缓存失败”,实际是指 CI3 的 全局文件缓存机制(如 $this->cache->file->save())或第三方扩展(如 Redis/Memcached 客户端)在读写本地缓存目录时,因路径含中文而报错或静默失效。
确认是不是文件缓存路径问题
CI3 的文件缓存驱动依赖 PHP 的 file_put_contents() 和目录操作函数,Windows 下若 cache_path(通常设在 application/cache/)父路径含中文(例如 D:\我的项目\ci3\application\cache\),会导致:
- mkdir() 创建子目录失败,返回 false
- file_put_contents() 写入时抛 Warning:“failed to open stream: Invalid argument”
- 缓存看似“保存成功”,但后续
get()返回 null(因文件根本没写进去)
快速验证与定位方法
在控制器中加一段调试代码:
(替换为你实际的 cache 目录路径)$path = APPPATH . 'cache/';<br>var_dump($path);<br>var_dump(is_writable($path));<br>var_dump(@mkdir($path . 'test', 0755, true));<br>var_dump(file_put_contents($path . 'test.txt', 'ok'));
若其中任意一步返回 false 或警告,且 $path 含中文字符(如 “我的项目”),即可锁定为路径编码问题。
根本解决办法
不要尝试对中文路径做 urldecode 或 iconv 转码——PHP 文件系统函数在 Windows 下对 UTF-8 路径支持极弱。正确做法是:
- 将整个 CI3 项目移到纯英文、无空格路径下,例如:
C:\ci3-project\或D:\work\myapp\ - 检查
application/config/cache.php中是否手动设置了$config['cache_path'],确保其值为绝对路径且不含中文(推荐留空,让 CI3 自动用APPPATH.'cache/') - 若使用自定义缓存类或 Composer 包(如
stalecucumber/codeigniter-cache),检查其初始化时传入的路径变量是否来自用户输入或配置文件中的中文路径
补充:避免被其他中文路径连带影响
即使 cache 目录本身没问题,以下位置含中文也会间接导致缓存异常:
-
APPPATH(即application/所在目录)含中文 → 影响自动加载、日志写入、甚至部分缓存驱动的 base path 推导 - Web 服务器文档根目录(如 Apache 的 DocumentRoot 或 Nginx 的 root)含中文 → 某些 CGI/FastCGI 环境下会污染
$_SERVER['DOCUMENT_ROOT'],进而干扰相对路径解析 - PHP 的
sys_temp_dir(可通过sys_get_temp_dir()查看)含中文 → CI3 日志、Session 文件临时写入可能失败,引发连锁缓存降级


















