Yii - Mise en cache

La mise en cache est un moyen efficace d'améliorer les performances de votre application. Les mécanismes de mise en cache stockent les données statiques dans le cache et les récupèrent à partir du cache sur demande. Côté serveur, vous pouvez utiliser le cache pour stocker des données de base, telles qu'une liste des actualités les plus récentes. Vous pouvez également stocker des fragments de page ou des pages Web entières. Côté client, vous pouvez utiliser la mise en cache HTTP pour conserver les pages les plus récemment visitées dans le cache du navigateur.

Préparation de la base de données

Step 1- Créez une nouvelle base de données. La base de données peut être préparée des deux manières suivantes.

  • Dans le terminal, exécutez mysql -u root –p

    .
  • Créez une nouvelle base de données via CREATE DATABASE helloworld CHARACTER SET utf8 COLLATE utf8_general_ci;

Step 2 - Configurer la connexion à la base de données dans le config/db.phpfichier. La configuration suivante correspond au système actuellement utilisé.

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

Step 3 - Dans le dossier racine run ./yii migrate/create test_table. Cette commande créera une migration de base de données pour gérer notre base de données. Le fichier de migration doit apparaître dans lemigrations dossier de la racine du projet.

Step 4 - Modifier le fichier de migration (m160106_163154_test_table.php dans ce cas) de cette façon.

<?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 migration ci-dessus crée un usertable avec ces champs: id, nom et e-mail. Il ajoute également quelques utilisateurs de démonstration.

Step 5 - À l'intérieur de la racine du projet run ./yii migrate pour appliquer la migration à la base de données.

Step 6 - Maintenant, nous devons créer un modèle pour notre usertable. Par souci de simplicité, nous allons utiliser leGiioutil de génération de code. Ouvrez ceciurl: http://localhost:8080/index.php?r=gii. Ensuite, cliquez sur le bouton «Démarrer» sous l'en-tête «Générateur de modèle». Remplissez le nom de la table («utilisateur») et la classe de modèle («Mon utilisateur»), cliquez sur le bouton «Aperçu» et enfin, cliquez sur le bouton «Générer».

Le modèle MyUser doit apparaître dans le répertoire des modèles.

Mise en cache des données

La mise en cache des données vous aide à stocker les variables PHP dans le cache et à les récupérer plus tard. La mise en cache des données repose sur des composants de cache, qui sont généralement enregistrés en tant que composants d'application. Pour accéder au composant d'application, vous pouvez appelerYii::$app → cache. Vous pouvez enregistrer plusieurs composants d'application de cache.

Yii prend en charge les stockages de cache suivants -

  • yii \ caching \ DbCache - Utilise une table de base de données pour stocker les données mises en cache. Vous devez créer une table comme spécifié dans yii \ caching \ DbCache :: $ cacheTable.

  • yii \ caching \ ApcCache - Utilise l'extension PHP APC.

  • yii \ caching \ FileCache - Utilise des fichiers pour stocker les données mises en cache.

  • yii \ caching \ DummyCache - Sert de placeholder de cache qui ne fait pas de véritable mise en cache. Le but de ce composant est de simplifier le code qui a besoin de vérifier la disponibilité du cache.

  • yii \ caching \ MemCache - Utilise l'extension PHP memcache.

  • yii \ caching \ WinCache - Utilise l'extension PHP WinCache.

  • yii \ redis \ Cache - Implémente un composant de cache basé sur la base de données Redis.

  • yii \ caching \ XCache - Utilise l'extension PHP XCache.

Tous les composants de cache prennent en charge les API suivantes -

  • get () - Récupère une valeur de données du cache avec une clé spécifiée. Une valeur fausse sera renvoyée si la valeur des données est expirée / invalidée ou introuvable.

  • add () - Stocke une valeur de données identifiée par une clé dans le cache si la clé n'est pas trouvée dans le cache.

  • set () - Stocke une valeur de données identifiée par une clé dans le cache.

  • multiGet () - Récupère plusieurs valeurs de données du cache avec les clés spécifiées.

  • multiAdd () - Stocke plusieurs valeurs de données dans le cache. Chaque élément est identifié par une clé. Si une clé existe déjà dans le cache, la valeur des données sera ignorée.

  • multiSet () - Stocke plusieurs valeurs de données dans le cache. Chaque élément est identifié par une clé.

  • exist () - Renvoie une valeur indiquant si la clé spécifiée est trouvée dans le cache.

  • flush () - Supprime toutes les valeurs de données du cache.

  • delete () - Supprime une valeur de données identifiée par une clé du cache.

Une valeur de données stockée dans un cache y restera pour toujours à moins qu'elle ne soit supprimée. Pour modifier ce comportement, vous pouvez définir un paramètre d'expiration lors de l'appel de la méthode set () pour stocker une valeur de données.

Les valeurs de données mises en cache peuvent également être invalidées par des modifications du cache dependencies -

  • yii \ caching \ DbDependency - La dépendance est modifiée si le résultat de la requête de l'instruction SQL spécifiée est modifié.

  • yii \ caching \ ChainedDependency - La dépendance est modifiée si l'une des dépendances de la chaîne est modifiée.

  • yii \ caching \ FileDependency - La dépendance est modifiée si l'heure de la dernière modification du fichier est modifiée.

  • yii \ caching \ ExpressionDependency - La dépendance est modifiée si le résultat de l'expression PHP spécifiée est modifié.

Maintenant, ajoutez le cache composant d'application à votre application.

Step 1 - Modifier le config/web.php fichier.

<?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 - Ajouter une nouvelle fonction appelée actionTestCache() au 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 - Type http://localhost:8080/index.php?r=site/test-cache dans la barre d'adresse du navigateur Web, vous verrez ce qui suit.

Step 4- Si vous rechargez la page, vous devriez remarquer que la date n'a pas changé. La valeur de la date est mise en cache et le cache expirera dans les 30 secondes. Rechargez la page après 30 secondes.

Mise en cache des requêtes

La mise en cache des requêtes vous permet de mettre en cache le résultat des requêtes de base de données. La mise en cache des requêtes nécessite une connexion à la base de données et le composant d'application de cache.

Step 1 - Ajouter une nouvelle méthode appelée actionQueryCaching() au 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());
}

Dans le code ci-dessus, nous mettons en cache la requête de base de données, ajoutons un nouvel utilisateur et affichons le nombre d'utilisateurs.

Step 2 - Aller à l'URL http://localhost:8080/index.php?r=site/query-caching et rechargez la page.

Lorsque nous ouvrons la page pour la première, nous mettons en cache la requête DB et affichons le nombre de tous les utilisateurs. Lorsque nous rechargeons la page, le résultat de la requête de base de données mise en cache est le même que parce que la requête de base de données est mise en cache.

Vous pouvez vider le cache de la console à l'aide des commandes suivantes -

  • yii cache - Affiche les composants de cache disponibles.

  • yii cache/flush cache1 cache2 cache3 - Vide les composants du cache cache1, cache2 et cache3.

  • yii cache/flush-all - Vide tous les composants du cache.

Step 3 - À l'intérieur de la racine du projet de votre application exécutée ./yii cache/flush-all.