Yii控制器里怎么使用缓存_文件缓存和Redis缓存调用【操作】

3次阅读

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

Yii控制器里怎么使用缓存_文件缓存和Redis缓存调用【操作】

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 精确控制,但必须先装好 phpredispredis 扩展,并确保 Redis 服务可达。

典型问题:class 'PredisClient' not found(扩展没装),或 Connection refused(Redis 地址/端口配错)。

  • config/web.php 里把 cache 组件换成 yiiredisCache,别漏掉 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.phpconfig/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 或提前约定好前缀再批量删

缓存失效逻辑和键生命周期比代码本身更难调试,尤其是跨请求、跨机器时。别假设“我刚 set 了,它就一定还在”。

text=ZqhQzanResources