数据缓存
数据缓存也就是在缓存中存储一些 PHP 变量,过一会再取出来。缓存基础类 CCache 提供了两个最常用的方法:set()和 get()。
要在缓存中存储变量 $value
,我们选择一个唯一 ID 并调用 set() 来存储它:
- Yii::app()->cache->set($id, $value);
被缓存的数据会一直保留在缓存中,直到因一些缓存策略而被删除(比如缓存空间满了,删除最旧的数据)。要改变这一行为,我们还可以在调用 set() 时加一个过期参数,这样数据过一段时间就会自动从缓存中清除。
- // 在缓存中保留该值最多 30 秒
- Yii::app()->cache->set($id, $value, 30);
当我们稍后需要访问该变量时(不管是不是同一 Web 请求),我们调用 get() (传入 ID)来从缓存中获取它。如果返回值为 false,说明该缓存不可用,需要我们重新生成它。
- $value=Yii::app()->cache->get($id);
- if($value===false)
- {
- // 因为在缓存中没找到,重新生成 $value
- // 再缓存一下以备下次使用
- // Yii::app()->cache->set($id,$value);
- }
为一个要缓存的变量选择 ID 时,确保该 ID 在应用中是唯一的。不必保证 ID 在跨应用的情况下保证唯一,因为缓存组件有足够的智能来区分不同应用的缓存 ID。
要从缓存中删除一个缓存值,调用 delete();要清空所有缓存,调用 flush()。调用 flush() 时要非常小心,因为它会把其它应用的缓存也清空。
提示: 因为 CCache 实现了ArrayAccess
接口,可以像数组一样使用缓存组件。例如:
- $cache=Yii::app()->cache;$cache['var1']=$value1; // 相当于: $cache->set('var1',$value1);$value2=$cache['var2']; // 相当于: $value2=$cache->get('var2');
1. 缓存依赖
除了过期设置,缓存数据还会因某些依赖条件发生改变而失效。如果我们缓存了某文件的内容,而该文件后来又被更新了,我们应该让缓存中的拷贝失效,从文件中读取最新内容(而不是从缓存)。
我们把一个依赖关系表现为一个 CCacheDependency 或它的子类的实例,调用 set() 的时候把依赖实例和要缓存的数据一起传入。
- // 缓存将在 30 秒后过期
- // 也可能因依赖的文件有更新而更快失效
- Yii::app()->cache->set($id, $value, 30, new CFileCacheDependency('FileName'));
如果我们现在调用 get() 从缓存中获取 $value
,缓存组件将检查依赖条件。如果有变,我们会得到 false 值——数据需要重新生成。
下面是可用的缓存依赖的简要说明:
CFileCacheDependency: 该依赖因文件的最近修改时间发生改变而改变。
CDirectoryCacheDependency: 该依赖因目录(或其子目录)下的任何文件发生改变而改变。
CDbCacheDependency: 该依赖因指定的 SQL 语句的查询结果发生改变而改变。
CGlobalStateCacheDependency: 该依赖因指定的全局状态值发生改变而改变。全局状态是应用中跨请求、跨 SESSION 的持久变量,它由 CApplication::setGlobalState() 来定义。
CChainedCacheDependency: 该依赖因依赖链中的任何一环发生改变而改变。