Yii - 碎片缓存



片段缓存提供对网页片段的缓存。

步骤 1 − 向 SiteController 添加一个名为 actionFragmentCaching() 的新函数。

public function actionFragmentCaching() {
   $user = new MyUser();
   $user->name = "cached user name";
   $user->email = "[email protected]";
   $user->save();
   $models = MyUser::find()->all();
   return $this->render('cachedview', ['models' => $models]);
}

在上面的代码中,我们创建了一个新用户并显示了一个 cachedview 视图文件。

步骤 2 − 现在,在 views/site 文件夹中创建一个名为 cachedview.php 的新文件。

<?php if ($this->beginCache('cachedview')) { ?>
   <?php foreach ($models as $model): ?>
      <?= $model->id; ?>
      <?= $model->name; ?>
      <?= $model->email; ?>
      <br/>
   <?php endforeach; ?>
<?php $this->endCache(); } ?>
<?php echo "Count:", \app\models\MyUser::find()->count(); ?>

我们将内容生成逻辑包含在一对 beginCache() 和 endCache() 方法中。如果缓存中找到了内容,beginCache() 方法将渲染它。

步骤 3 − 转到 URL https://127.0.0.1:8080/index.php?r=site/fragment-caching 并重新加载页面。输出如下所示。

Fragment Caching

请注意,beginCache() 和 endCache() 方法之间的内容已缓存。在数据库中,我们有 13 个用户,但只显示了 12 个。

页面缓存

页面缓存提供对整个网页内容的缓存。页面缓存由 yii\filter\PageCache 支持。

步骤 1 − 修改 SiteController 的 behaviors() 函数。

public function behaviors() {
   return [
      'access' => [
         'class' => AccessControl::className(),
         'only' => ['logout'],
         'rules' => [
            [
               'actions' => ['logout'],
               'allow' => true,
               'roles' => ['@'],
            ],
         ],
      ],
      'verbs' => [
         'class' => VerbFilter::className(),
         'actions' => [
            'logout' => ['post'],
         ],
      ],
      [
         'class' => 'yii\filters\PageCache',
         'only' => ['index'],
         'duration' => 60
      ],
   ];
}

上面的代码将索引页面缓存 60 秒。

步骤 2 − 转到 URL https://127.0.0.1:8080/index.php?r=site/index。然后,修改索引视图文件的祝贺消息。如果您重新加载页面,您不会注意到任何更改,因为页面已缓存。等待一分钟然后再次重新加载页面。

Page Caching

HTTP 缓存

Web 应用程序也可以使用客户端缓存。要使用它,您可以为控制器操作配置 yii\filter\HttpCache 过滤器。

Last-Modified 头使用时间戳来指示页面是否已被修改。

步骤 1 − 要启用发送 Last-Modified 头,请配置 yii\filter\HttpCache::$lastModified 属性。

public function behaviors() {
   return [
      [
         'class' => 'yii\filters\HttpCache',
         'only' => ['index'],
         'lastModified' => function ($action, $params) {
            $q = new \yii\db\Query();
            return $q->from('news')->max('created_at');
         },
      ],
   ];
}

在上面的代码中,我们仅为索引页面启用了 HTTP 缓存。当浏览器第一次打开索引页面时,页面将在服务器端生成并发送到浏览器。第二次,如果没有创建新闻,服务器将不会重新生成页面。

Etag 头提供一个表示页面内容的哈希值。如果页面更改,哈希值也将更改。

步骤 2 − 要启用发送 Etag 头,请配置 yii\filters\HttpCache::$etagSeed 属性。

public function behaviors() {
   return [
      [
         'class' => 'yii\filters\HttpCache',
         'only' => ['index'],
         'etagSeed' => function ($action, $params) {
            $user = $this->findModel(\Yii::$app->request->get('id'));
            return serialize([$user->name, $user->email]);
         },
      ],
   ];
}

在上面的代码中,我们仅为 index 操作启用了 HTTP 缓存。它应该根据用户的姓名和电子邮件生成 Etag HTTP 头。当浏览器第一次打开索引页面时,页面将在服务器端生成并发送到浏览器。第二次,如果姓名或电子邮件没有更改,服务器将不会重新生成页面。

广告