Yii - 片段缓存

  • 简述

    片段缓存提供网页片段的缓存。
    第 1 步- 向 SiteController 添加一个名为actionFragmentCaching()的新函数。
    
    public function actionFragmentCaching() {
       $user = new MyUser();
       $user->name = "cached user name";
       $user->email = "cacheduseremail@gmail.com";
       $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 http://localhost:8080/index.php?r=site/fragment-caching并重新加载页面。以下将是输出。
    片段缓存
    请注意,beginCache() 和 endCache() 方法之间的内容是缓存的。在数据库中,我们有 13 个用户,但只显示了 12 个。
  • 页面缓存

    页面缓存提供缓存整个网页的内容。yii\filter\PageCache支持页面缓存。
    第 1 步- 修改 SiteController 的behavior()函数。
    
    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 http://localhost:8080/index.php?r=site/index。然后,修改索引视图文件的祝贺信息。如果您重新加载页面,您将不会注意到任何更改,因为该页面已被缓存。稍等片刻,然后重新加载页面。
    页面缓存
  • 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 标头。当浏览器第一次打开索引页面时,页面在服务器端生成并发送给浏览器。第二次,如果名称或电子邮件没有更改,服务器将不会重新生成页面。