缓存
数据缓存
缓存组件的基类 CCache 提供了两个最常用的方法: set() 和 get();
1.设置缓存数据
// 值
value在缓存中最多保留30秒Yii::app()−>cache−>set(
id, $value, 30);
2.获取缓存
$value=Yii::app()->cache->get($id);
缓存依赖
除了过期设置,缓存数据也可能会因为依赖条件发生变化而失效。例如,如果我们缓存了某些文件的内容,而这些文件发生了改变,我们就应该让缓存的数据失效, 并从文件中读取最新内容而不是从缓存中读取。
我们将一个依赖关系表现为一个 CCacheDependency 或其子类的实例。 当调用 set() 时,我们连同要缓存的数据将其一同传入。
// 此值将在30秒后失效
// 也可能因依赖的文件发生了变化而更快失效
Yii::app()->cache->set($id, $value, 30, new CFileCacheDependency('FileName'));
如下是可用的缓存依赖的简要说明:
CFileCacheDependency: 如果文件的最后修改时间发生改变,则依赖改变。
CDirectoryCacheDependency: 如果目录和其子目录中的文件发生改变,则依赖改变。
CDbCacheDependency: 如果指定 SQL 语句的查询结果发生改变,则依赖改变。
CGlobalStateCacheDependency: 如果指定的全局状态发生改变,则依赖改变。全局状态是应用中的一个跨请求,跨会话的变量。它是通过 CApplication::setGlobalState() 定义的。
CChainedCacheDependency: 如果链中的任何依赖发生改变,则此依赖改变。
CExpressionDependency: 如果指定的 PHP 表达式的结果发生改变,则依赖改变。
片段缓存
要使用片段缓存,在控制器视图脚本中调用CController::beginCache() 和CController::endCache() 是[ COutputCache ]widget的包装。这两种方法开始和结束包括的页面内容将被缓存。类似data caching ,我们需要一个编号,识别被缓存的片段。
...别的HTML内容...
<?php if($this->beginCache($id)) { ?>
...被缓存的内容...
<?php $this->endCache(); } ?>
...别的HTML内容...
在上面的,如果beginCache() 返回false,缓存的内容将此地方自动插入; 否则,在if语句内的内容将被执行并在endCache()触发时缓存。
1.缓存选项
可以通过duration设置有效期,比如设置一个小时
...其他HTML内容...
<?php if($this->beginCache($id, array('duration'=>3600))) { ?>
...被缓存的内容...
<?php $this->endCache(); } ?>
...其他HTML内容...
可以通过建立dependency实现CDbCacheDependency对象或者用于生成依赖对象的配置数组。如下代码指定内容取决于lastModified值是否变化
...其他HTML内容...
<?php if($this->beginCache($id, array('dependency'=>array(
'class'=>'system.caching.dependencies.CDbCacheDependency',
'sql'=>'SELECT MAX(lastModified) FROM Post')))) { ?>
...被缓存的内容...
<?php $this->endCache(); } ?>
...其他HTML内容...
变化
缓存的内容可根据一些参数变化。例如,每个人的档案都不一样。缓存的档案内容将根据每个人ID变化。这意味着,当调用beginCache()时将用不同的ID。
COutputCache内置了这一特征,程序员不需要编写根据ID变动内容的模式。以下是内置的变动内容
varyByRoute: 设置此选项为true ,缓存的内容将根据route变化。因此,每个控制器和行动的组合将有一个单独的缓存内容。
varyBySession: 设置此选项为true ,缓存的内容将根据session ID变化。因此,每个用户会话可能会看到由缓存提供的不同内容。
varyByParam: 设置此选项的数组里的名字,缓存的内容将根据GET参数的值变动。例如,如果一个页面显示文章的内容根据id的GET参数,我们可以指定varyByParam为array('id'),以使我们能够缓存每篇文章内容。如果没有这样的变化,我们只能能够缓存某一文章。
varyByExpression:缓存根据PHP表达式的结果变量。
请求类型缓存
我们可以指定requestTypes 选项:比如缓存GET请求结果
...其他HTML内容...
<?php if($this->beginCache($id, array('requestTypes'=>array('GET')))) { ?>
...被缓存的内容...
<?php $this->endCache(); } ?>
...其他HTML内容..
2.嵌套缓存
片段缓存可以嵌套缓存
..其他HTML内容...
<?php if($this->beginCache($id1)) { ?>
...外部被缓存内容...
<?php if($this->beginCache($id2)) { ?>
...内部被缓存内容...
<?php $this->endCache(); } ?>
...外部被缓存内容...
<?php $this->endCache(); } ?>
...其他HTML内容...
注:外部缓存失效,内部缓存依然可以提供有效缓存
外部缓存有效,但是内部缓存无效,则内部缓存永远是内部缓存副本。
页面缓存 (内容涉及到前端,资料过少,可通过项目熟悉)
过滤器设置
public function filters()
{
return array(
array(
'COutputCache',
'duration'=>100,
'varyByParam'=>array('id'),
),
);
}
动态内容:
当静态类容中部分需要动态显示时候,可以通过CController::renderDynamic()实现,如下
...别的HTML内容...
<?php if($this->beginCache($id)) { ?>
...被缓存的片段内容...
<?php $this->renderDynamic($callback); ?>
...被缓存的片段内容...
<?php $this->endCache(); } ?>
...别的HTML内容...
这其中$callback指的是有效的PHP回调。它可以是指向当前控制器类的方法或者全局函数的字符串名。它也可以是一个数组名指向一个类的方法。