yii2中调用filecache需配置可写绝对路径如'@runtime/cache',控制器中用yii::$app->cache->get/set;切换rediscache则需配置yii\redis\cache组件,调用方式不变。

Yii2 里怎么调用 FileCache
FileCache 是 Yii2 自带的轻量级文件缓存,适合开发环境或低并发场景。它不依赖外部服务,但要注意路径权限和性能瓶颈。
常见错误现象:Failed to open stream: Permission denied(缓存目录不可写),或缓存始终不生效(cachePath 配置未生效)。
- 确保
cachePath指向可写的绝对路径,比如'@runtime/cache';别用相对路径或未定义的别名 - 在控制器里直接用
Yii::$app->cache,前提是配置里已启用fileCache组件(默认配置名就是cache) - 读写时注意键名规范:避免特殊字符、过长(文件系统限制)、层级过深(部分 OS 对单目录文件数有限制)
- 示例:
$key = 'user_profile_' . $id; $data = Yii::$app->cache->get($key); if ($data === false) { $data = User::findOne($id)->toArray(); Yii::$app->cache->set($key, $data, 3600); // 缓存 1 小时 }
Yii2 控制器里怎么切换到 RedisCache
RedisCache 性能更好、支持原子操作和 TTL 精确控制,但必须先装好 phpredis 或 predis 扩展,并确保 Redis 服务可达。
典型问题:Class 'Predis\Client' not found(扩展没装),或 Connection refused(Redis 地址/端口配错)。
- 在
config/web.php里把cache组件换成yii\redis\Cache,别漏掉redis子组件配置 - 控制器中调用方式完全一样:
Yii::$app->cache->get()/set(),无需改业务代码——这是 Yii 缓存抽象层的好处 - 注意
keyPrefix:多个应用共用一个 Redis 实例时,务必设不同前缀,否则缓存会互相覆盖 - Redis 默认序列化用
phpserialize,如果缓存含 Closure 或资源句柄会失败;建议只缓存数组、字符串、数字
为什么 set() 后 get() 还是 false?
不是代码写错了,大概率是缓存组件根本没启用,或者被中间件/行为意外禁用。
- 检查
Yii::$app->cache是否为null:在控制器 action 开头加var_dump(Yii::$app->cache)确认实例存在 - 确认当前环境没禁用缓存:比如某些调试模式下,
enableCaching被设为false(尤其在config/test.php或config/local.php中) - Redis 场景下,
set()返回false但没报错?可能是 key 超过 Redis 的maxmemory触发 LRU 清理,或设置了过短 TTL 导致立刻过期 - FileCache 下,
get()失败也可能是文件被手动删了,或gcProbability太低导致过期文件堆积,磁盘满后新写入失败
缓存键设计不当引发的坑
缓存键看着只是个字符串,但它决定命中率、隔离性和维护成本。Yii 不做自动命名空间隔离,全靠你来控制。
- 别用纯数字或用户输入直拼:
Yii::$app->cache->get($_GET['id'])—— 可能撞键、有注入风险、无法批量清理 - 推荐格式:
user:profile:{$id}或order:list:uid_{$uid}:page_{$page},用冒号分隔语义层级 - 涉及权限或状态的缓存,一定要把关键上下文塞进 key:比如后台管理员查看用户数据,不能和前台用户共用同一组 key
- 想清空某类缓存?FileCache 只能删目录;Redis 可用
keys user:profile:*+del,但生产环境慎用keys命令——建议用scan或提前约定好前缀再批量删










