Yii-fragment-caching

提供:Dev Guides
移動先:案内検索

Yii-フラグメントキャッシング

フラグメントキャッシングは、Webページのフラグメントのキャッシングを提供します。

ステップ1 *- actionFragmentCaching()*という新しい関数をSiteControllerに追加します。

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 *http://localhost:8080/index.php?r = site/fragment-caching にアクセスして、ページをリロードします。 出力は次のようになります。

フラグメントキャッシュ

beginCache()メソッドとendCache()メソッドの間のコンテンツがキャッシュされることに注意してください。 データベースには13人のユーザーがいますが、表示されるのは12人だけです。

ページキャッシュ

ページキャッシュは、Webページ全体のコンテンツのキャッシュを提供します。 ページキャッシュは 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 *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キャッシュを有効にしました。 ブラウザーが初めてインデックスページを開くと、サーバー側でページが生成され、ブラウザーに送信されます。 2回目は、ニュースが作成されない場合、サーバーはページを再生成しません。

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ヘッダーを生成する必要があります。 ブラウザーが初めてインデックスページを開くと、サーバー側でページが生成され、ブラウザーに送信されます。 2回目は、名前または電子メールに変更がない場合、サーバーはページを再生成しません。