Yii - Caching

La memorizzazione nella cache è un modo efficace per migliorare le prestazioni dell'applicazione. I meccanismi di memorizzazione nella cache memorizzano i dati statici nella cache e li ottengono dalla cache quando richiesto. Sul lato server, puoi utilizzare la cache per memorizzare i dati di base, come un elenco delle notizie più recenti. Puoi anche memorizzare frammenti di pagina o intere pagine web. Sul lato client, puoi utilizzare la cache HTTP per mantenere le pagine visitate più di recente nella cache del browser.

Preparazione del DB

Step 1- Crea un nuovo database. Il database può essere preparato nei due modi seguenti.

  • Nel terminale eseguire mysql -u root –p

    .
  • Creare un nuovo database tramite CREATE DATABASE helloworld CHARACTER SET utf8 COLLATE utf8_general_ci;

Step 2 - Configurare la connessione al database in config/db.phpfile. La seguente configurazione è per il sistema attualmente utilizzato.

<?php
   return [
      'class' => 'yii\db\Connection',
      'dsn' => 'mysql:host=localhost;dbname=helloworld',
      'username' => 'vladimir',
      'password' => '12345',
      'charset' => 'utf8',
   ];
?>

Step 3 - All'interno della cartella principale run ./yii migrate/create test_table. Questo comando creerà una migrazione del database per la gestione del nostro DB. Il file di migrazione dovrebbe apparire nel filemigrations cartella della radice del progetto.

Step 4 - Modifica il file di migrazione (m160106_163154_test_table.php in questo caso) in questo modo.

<?php
   use yii\db\Schema;
   use yii\db\Migration;
   class m160106_163154_test_table extends Migration {
      public function safeUp()\ {
         $this->createTable("user", [ "id" => Schema::TYPE_PK, "name" => Schema::TYPE_STRING, "email" => Schema::TYPE_STRING, ]); $this->batchInsert("user", ["name", "email"], [
            ["User1", "[email protected]"],
            ["User2", "[email protected]"],
            ["User3", "[email protected]"],
            ["User4", "[email protected]"],
            ["User5", "[email protected]"],
            ["User6", "[email protected]"],
            ["User7", "[email protected]"],
            ["User8", "[email protected]"],
            ["User9", "[email protected]"],
            ["User10", "[email protected]"],
            ["User11", "[email protected]"],
         ]);
      }
      public function safeDown() {
         $this->dropTable('user');
      }
   }
?>

La migrazione di cui sopra crea un file usertabella con questi campi: id, nome ed email. Aggiunge anche alcuni utenti demo.

Step 5 - All'interno della radice del progetto run ./yii migrate per applicare la migrazione al database.

Step 6 - Ora, dobbiamo creare un modello per il nostro usertavolo. Per motivi di semplicità, utilizzeremo ilGiistrumento di generazione del codice. Apri questourl: http://localhost:8080/index.php?r=gii. Quindi, fare clic sul pulsante "Start" sotto l'intestazione "Generatore di modelli". Compilare il nome della tabella ("utente") e la classe del modello ("MyUser"), fare clic sul pulsante "Anteprima" e infine fare clic sul pulsante "Genera".

Il modello MyUser dovrebbe apparire nella directory dei modelli.

Memorizzazione nella cache dei dati

La memorizzazione nella cache dei dati ti aiuta a memorizzare le variabili PHP nella cache e a recuperarle in seguito. La memorizzazione nella cache dei dati si basa sui componenti della cache, che in genere vengono registrati come componenti dell'applicazione. Per accedere al componente dell'applicazione, è possibile chiamareYii::$app → cache. È possibile registrare diversi componenti dell'applicazione cache.

Yii supporta i seguenti archivi cache:

  • yii \ caching \ DbCache : utilizza una tabella di database per archiviare i dati memorizzati nella cache. È necessario creare una tabella come specificato in yii \ caching \ DbCache :: $ cacheTable.

  • yii \ caching \ ApcCache - Utilizza l'estensione PHP APC.

  • yii \ caching \ FileCache : utilizza i file per archiviare i dati memorizzati nella cache.

  • yii \ caching \ DummyCache - Funge da segnaposto della cache che non esegue la memorizzazione nella cache. Lo scopo di questo componente è semplificare il codice che deve controllare la disponibilità della cache.

  • yii \ caching \ MemCache - Utilizza l'estensione memcache di PHP.

  • yii \ caching \ WinCache - Utilizza l'estensione PHP WinCache.

  • yii \ redis \ Cache : implementa un componente cache basato sul database Redis.

  • yii \ caching \ XCache - Utilizza l'estensione PHP XCache.

Tutti i componenti della cache supportano le seguenti API:

  • get () - Recupera un valore di dati dalla cache con una chiave specificata. Verrà restituito un valore falso se il valore dei dati è scaduto / invalidato o non è stato trovato.

  • add () - Memorizza un valore di dati identificato da una chiave nella cache se la chiave non viene trovata nella cache.

  • set () - Memorizza un valore di dati identificato da una chiave nella cache.

  • multiGet () : recupera più valori di dati dalla cache con le chiavi specificate.

  • multiAdd () - Memorizza più valori di dati nella cache. Ogni elemento è identificato da una chiave. Se una chiave esiste già nella cache, il valore dei dati verrà ignorato.

  • multiSet () - Memorizza più valori di dati nella cache. Ogni elemento è identificato da una chiave.

  • esiste () - Restituisce un valore che indica se la chiave specificata si trova nella cache.

  • flush () - Rimuove tutti i valori dei dati dalla cache.

  • delete () - Rimuove un valore di dati identificato da una chiave dalla cache.

Un valore di dati archiviato in una cache rimarrà lì per sempre a meno che non venga rimosso. Per modificare questo comportamento, è possibile impostare un parametro di scadenza quando si chiama il metodo set () per memorizzare un valore di dati.

I valori dei dati memorizzati nella cache possono anche essere invalidati dalle modifiche del file cache dependencies -

  • yii \ caching \ DbDependency - La dipendenza viene modificata se viene modificato il risultato della query dell'istruzione SQL specificata.

  • yii \ caching \ ChainedDependency - La dipendenza viene modificata se viene modificata una qualsiasi delle dipendenze sulla catena.

  • yii \ caching \ FileDependency : la dipendenza viene modificata se viene modificata l'ora dell'ultima modifica del file.

  • yii \ caching \ ExpressionDependency - La dipendenza viene modificata se il risultato dell'espressione PHP specificata viene modificato.

Ora aggiungi il file cache componente dell'applicazione all'applicazione.

Step 1 - Modifica il file config/web.php file.

<?php
   $params = require(__DIR__ . '/params.php');
   $config = [ 'id' => 'basic', 'basePath' => dirname(__DIR__), 'bootstrap' => ['log'], 'components' => [ 'request' => [ // !!! insert a secret key in the following (if it is empty) - this //is required by cookie validation 'cookieValidationKey' => 'ymoaYrebZHa8gURuolioHGlK8fLXCKjO', ], 'cache' => [ 'class' => 'yii\caching\FileCache', ], 'user' => [ 'identityClass' => 'app\models\User', 'enableAutoLogin' => true, ], 'errorHandler' => [ 'errorAction' => 'site/error', ], 'mailer' => [ 'class' => 'yii\swiftmailer\Mailer', // send all mails to a file by default. You have to set // 'useFileTransport' to false and configure a transport // for the mailer to send real emails. 'useFileTransport' => true, ], 'log' => [ 'traceLevel' => YII_DEBUG ? 3 : 0, 'targets' => [ [ 'class' => 'yii\log\FileTarget', 'levels' => ['error', 'warning'], ], ], ], 'db' => require(__DIR__ . '/db.php'), ], 'modules' => [ 'hello' => [ 'class' => 'app\modules\hello\Hello', ], ], 'params' => $params,
   ];
   if (YII_ENV_DEV) {
      // configuration adjustments for 'dev' environment
      $config['bootstrap'][] = 'debug'; $config['modules']['debug'] = [
         'class' => 'yii\debug\Module',
      ];
      $config['bootstrap'][] = 'gii'; $config['modules']['gii'] = [
         'class' => 'yii\gii\Module',
      ];
   }
   return $config;
?>

Step 2 - Aggiungi una nuova funzione chiamata actionTestCache() al SiteController.

public function actionTestCache() {
   $cache = Yii::$app->cache; // try retrieving $data from cache
   $data = $cache->get("my_cached_data");
   if ($data === false) { // $data is not found in cache, calculate it from scratch
      $data = date("d.m.Y H:i:s"); // store $data in cache so that it can be retrieved next time
      $cache->set("my_cached_data", $data, 30);
   }
   // $data is available here var_dump($data);
}

Step 3 - Tipo http://localhost:8080/index.php?r=site/test-cache nella barra degli indirizzi del browser web, vedrai quanto segue.

Step 4- Se ricarichi la pagina, dovresti notare che la data non è cambiata. Il valore della data viene memorizzato nella cache e la cache scadrà entro 30 secondi. Ricarica la pagina dopo 30 secondi.

Caching delle query

La memorizzazione nella cache delle query consente di memorizzare nella cache il risultato delle query del database. La memorizzazione nella cache delle query richiede una connessione DB e il componente dell'applicazione cache.

Step 1 - Aggiungi un nuovo metodo chiamato actionQueryCaching() al SiteController.

public function actionQueryCaching() {
   $duration = 10; $result = MyUser::getDb()->cache(function ($db) { return MyUser::find()->count(); }, $duration);
   var_dump($result); $user = new MyUser();
   $user->name = "cached user name"; $user->email = "[email protected]";
   $user->save();
   echo "==========";
   var_dump(MyUser::find()->count());
}

Nel codice precedente, memorizziamo nella cache la query del database, aggiungiamo un nuovo utente e visualizziamo il conteggio degli utenti.

Step 2 - Vai all'URL http://localhost:8080/index.php?r=site/query-caching e ricarica la pagina.

Quando apriamo la pagina per la prima volta, memorizziamo nella cache la query DB e visualizziamo il conteggio di tutti gli utenti. Quando ricarichiamo la pagina, il risultato della query DB memorizzata nella cache è lo stesso che era perché la query del database è memorizzata nella cache.

Puoi svuotare la cache dalla console utilizzando i seguenti comandi:

  • yii cache - Mostra i componenti della cache disponibili.

  • yii cache/flush cache1 cache2 cache3 - Svuota i componenti della cache cache1, cache2 e cache3.

  • yii cache/flush-all - Svuota tutti i componenti della cache.

Step 3 - All'interno della radice del progetto della tua applicazione eseguita ./yii cache/flush-all.