片段缓存是指缓存网页的一部分。例如,如果一个页面在一个表格中显示了年度销售额的摘要,您可以将此表格存储在缓存中,以消除每次请求时生成此表格所需的时间。片段缓存建立在 数据缓存 的基础之上。
要使用片段缓存,请在 视图 中使用以下结构
if ($this->beginCache($id)) {
// ... generate content here ...
$this->endCache();
}
也就是说,将内容生成逻辑包含在 beginCache() 和 endCache() 调用对中。如果在缓存中找到内容,beginCache() 将呈现缓存的内容并返回 false
,从而跳过内容生成逻辑。否则,您的内容生成逻辑将被调用,并且当 endCache() 被调用时,生成的内容将被捕获并存储在缓存中。
与 数据缓存 一样,需要一个唯一的 $id
来标识内容缓存。
要删除片段缓存,您可以使用 `
php Yii::$app->cache->delete(['yii\widgets\FragmentCache', $id]); `
您可以通过将选项数组作为第二个参数传递给 beginCache() 方法来指定有关片段缓存的附加选项。在幕后,此选项数组将用于配置一个 yii\widgets\FragmentCache 小部件,该小部件实现了实际的片段缓存功能。
片段缓存最常用的选项可能是 duration。它指定内容在缓存中可以保持有效的秒数。以下代码将内容片段缓存不超过一小时
if ($this->beginCache($id, ['duration' => 3600])) {
// ... generate content here ...
$this->endCache();
}
如果未设置该选项,它将采用默认值 60,这意味着缓存的内容将在 60 秒后过期。
与 数据缓存 一样,被缓存的内容片段也可以有依赖项。例如,显示的帖子的内容取决于帖子是否被修改。
要指定依赖项,请设置 dependency 选项,它可以是 yii\caching\Dependency 对象,也可以是用于创建依赖项对象的配置数组。以下代码指定片段内容依赖于 updated_at
列值的更改
$dependency = [
'class' => 'yii\caching\DbDependency',
'sql' => 'SELECT MAX(updated_at) FROM post',
];
if ($this->beginCache($id, ['dependency' => $dependency])) {
// ... generate content here ...
$this->endCache();
}
缓存的内容可能会根据某些参数而变化。例如,对于支持多种语言的 Web 应用程序,相同的视图代码可能会生成不同语言的内容。因此,您可能希望根据当前应用程序语言使缓存的内容发生变化。
要指定缓存变体,请设置 variations 选项,它应该是一个标量值的数组,每个值代表一个特定的变体因素。例如,要使缓存的内容根据语言而变化,您可以使用以下代码
if ($this->beginCache($id, ['variations' => [Yii::$app->language]])) {
// ... generate content here ...
$this->endCache();
}
有时您可能希望仅在满足某些条件时才启用片段缓存。例如,对于显示表单的页面,您可能只想在首次请求表单时(通过 GET 请求)缓存表单。对表单的任何后续显示(通过 POST 请求)都不应被缓存,因为表单可能包含用户输入。为此,您可以设置 enabled 选项,如下所示
if ($this->beginCache($id, ['enabled' => Yii::$app->request->isGet])) {
// ... generate content here ...
$this->endCache();
}
片段缓存可以嵌套。也就是说,一个缓存的片段可以包含在另一个也被缓存的片段中。例如,评论被缓存在一个内部片段缓存中,它们与帖子内容一起被缓存在一个外部片段缓存中。以下代码展示了如何嵌套两个片段缓存
if ($this->beginCache($id1)) {
// ...content generation logic...
if ($this->beginCache($id2, $options2)) {
// ...content generation logic...
$this->endCache();
}
// ...content generation logic...
$this->endCache();
}
可以为嵌套缓存设置不同的缓存选项。例如,内部缓存和外部缓存可以使用不同的缓存持续时间值。即使外部缓存中缓存的数据被失效,内部缓存仍然可以提供有效的内部片段。但是,反过来就不成立了。如果外部缓存被评估为有效,即使内部缓存中的内容已被失效,它也会继续提供相同的缓存副本。因此,您必须谨慎设置嵌套缓存的持续时间或依赖项,否则可能会将过时的内部片段保留在外部片段中。
使用片段缓存时,您可能会遇到以下情况:一大块内容相对静态,但一两个地方除外。例如,页面页眉可能会显示主菜单栏以及当前用户的姓名。另一个问题是缓存的内容可能包含必须为每个请求执行的 PHP 代码(例如,注册资产包的代码)。这两个问题都可以通过所谓的“动态内容”功能解决。
动态内容是指即使包含在片段缓存中也不应被缓存的输出片段。为了使内容始终动态,它必须通过为每个请求执行一些 PHP 代码来生成,即使包含的内容是从缓存中提供的。
您可以在缓存的片段中调用 yii\base\View::renderDynamic() 以在所需位置插入动态内容,如下所示,
if ($this->beginCache($id1)) {
// ...content generation logic...
echo $this->renderDynamic('return Yii::$app->user->identity->name;');
// ...content generation logic...
$this->endCache();
}
The renderDynamic() method takes a piece of PHP code as its parameter. The return value of the PHP code is treated as the dynamic content. The same PHP code will be executed for every request, no matter the enclosing fragment is being served from cached or not.
注意: 从 2.0.14 版本开始,动态内容 API 通过 yii\base\DynamicContentAwareInterface 接口及其 yii\base\DynamicContentAwareTrait 特性公开。例如,您可以参考 yii\widgets\FragmentCache 类。
发现错别字或您认为此页面需要改进?
在 Github 上编辑它 !
注册 或 登录 才能发表评论。