Yii - Memorizzazione nella cache dei frammenti

La memorizzazione nella cache dei frammenti fornisce la memorizzazione nella cache di un frammento di una pagina Web.

Step 1 - Aggiungi una nuova funzione chiamata actionFragmentCaching() al 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]);
}

Nel codice sopra, abbiamo creato un nuovo utente e visualizzato un file cachedview vedi il file.

Step 2 - Ora, crea un nuovo file chiamato cachedview.php nel views/site cartella.

<?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(); ?>

Abbiamo racchiuso una logica di generazione del contenuto in una coppia di metodi beginCache () e endCache (). Se il contenuto si trova nella cache, il metodo beginCache () lo visualizzerà.

Step 3 - Vai all'URL http://localhost:8080/index.php?r=site/fragment-cachinge ricarica la pagina. Di seguito sarà l'output.

Notare che il contenuto tra i metodi beginCache () ed endCache () viene memorizzato nella cache. Nel database abbiamo 13 utenti ma ne vengono visualizzati solo 12.

Caching della pagina

La memorizzazione nella cache della pagina fornisce la memorizzazione nella cache del contenuto di un'intera pagina Web. La memorizzazione nella cache della pagina è supportata dayii\filter\PageCache.

Step 1 - Modifica il file behaviors() funzione del SiteController.

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
      ],
   ];
}

Il codice precedente memorizza nella cache la pagina dell'indice per 60 secondi.

Step 2 - Vai all'URL http://localhost:8080/index.php?r=site/index. Quindi, modificare il messaggio di congratulazioni del file della vista indice. Se ricarichi la pagina, non noterai alcun cambiamento perché la pagina è memorizzata nella cache. Aspetta un minuto e ricarica di nuovo la pagina.

Memorizzazione nella cache HTTP

Le applicazioni Web possono anche utilizzare la memorizzazione nella cache lato client. Per usarlo, puoi configurare ilyii\filter\HttpCache filtro per le azioni del controller.

L'intestazione Last-Modified utilizza un timestamp per indicare se la pagina è stata modificata.

Step 1 - Per abilitare l'invio dell'intestazione Last-Modified, configurare la proprietà 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');
         },
      ],
   ];
}

Nel codice sopra, abbiamo abilitato la memorizzazione nella cache HTTP solo per la pagina dell'indice. Quando un browser apre la pagina dell'indice per la prima volta, la pagina viene generata sul lato server e inviata al browser. La seconda volta, se non viene creata alcuna notizia, il server non rigenererà la pagina.

L'intestazione Etag fornisce un hash che rappresenta il contenuto della pagina. Se la pagina viene modificata, anche l'hash verrà modificato.

Step 2 - Per abilitare l'invio dell'intestazione Etag, configurare il file yii\filters\HttpCache::$etagSeed proprietà.

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]);
         },
      ],
   ];
}

Nel codice precedente, abbiamo abilitato la memorizzazione nella cache HTTP per indexsolo azione. Dovrebbe generare l'intestazione HTTP Etag in base al nome e all'email dell'utente. Quando un browser apre la pagina dell'indice per la prima volta, la pagina viene generata sul lato server e inviata al browser. La seconda volta, se non ci sono modifiche al nome o all'email, il server non rigenererà la pagina.