Yii - Almacenamiento en caché

El almacenamiento en caché es una forma eficaz de mejorar el rendimiento de su aplicación. Los mecanismos de almacenamiento en caché almacenan datos estáticos en caché y los obtienen de la caché cuando se solicitan. En el lado del servidor, puede usar la caché para almacenar datos básicos, como una lista de las noticias más recientes. También puede almacenar fragmentos de página o páginas web completas. En el lado del cliente, puede utilizar el almacenamiento en caché HTTP para mantener las páginas visitadas más recientemente en la caché del navegador.

Preparando la base de datos

Step 1- Crea una nueva base de datos. La base de datos se puede preparar de las dos formas siguientes.

  • En la terminal ejecuta mysql -u root –p

    .
  • Cree una nueva base de datos mediante CREATE DATABASE helloworld CHARACTER SET utf8 COLLATE utf8_general_ci;

Step 2 - Configure la conexión de la base de datos en el config/db.phparchivo. La siguiente configuración es para el sistema que se utiliza actualmente.

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

Step 3 - Dentro de la carpeta raíz run ./yii migrate/create test_table. Este comando creará una migración de base de datos para administrar nuestra base de datos. El archivo de migración debe aparecer en elmigrations carpeta de la raíz del proyecto.

Step 4 - Modificar el archivo de migración (m160106_163154_test_table.php en este caso) de esta manera.

<?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 migración anterior crea una usertabla con estos campos: id, nombre y correo electrónico. También agrega algunos usuarios de demostración.

Step 5 - Dentro de la raíz del proyecto run ./yii migrate para aplicar la migración a la base de datos.

Step 6 - Ahora, necesitamos crear un modelo para nuestro usermesa. En aras de la simplicidad, vamos a utilizar elGiiherramienta de generación de código. Abre estourl: http://localhost:8080/index.php?r=gii. Luego, haga clic en el botón "Inicio" debajo del encabezado "Generador de modelos". Complete el Nombre de la tabla ("usuario") y la Clase de modelo ("Mi usuario"), haga clic en el botón "Vista previa" y, finalmente, haga clic en el botón "Generar".

El modelo MyUser debería aparecer en el directorio de modelos.

Almacenamiento en caché de datos

El almacenamiento en caché de datos le ayuda a almacenar variables PHP en caché y recuperarlas más tarde. El almacenamiento en caché de datos se basa en componentes de caché, que generalmente se registran como componentes de aplicación. Para acceder al componente de la aplicación, puede llamarYii::$app → cache. Puede registrar varios componentes de la aplicación de caché.

Yii admite los siguientes almacenamientos de caché:

  • yii \ caching \ DbCache : utiliza una tabla de base de datos para almacenar datos en caché. Debe crear una tabla como se especifica en yii \ caching \ DbCache :: $ cacheTable.

  • yii \ caching \ ApcCache : utiliza la extensión PHP APC.

  • yii \ caching \ FileCache : utiliza archivos para almacenar datos en caché.

  • yii \ caching \ DummyCache : sirve como un marcador de posición de caché que no realiza un almacenamiento en caché real. El propósito de este componente es simplificar el código que necesita para verificar la disponibilidad de caché.

  • yii \ caching \ MemCache : utiliza la extensión de memcache de PHP.

  • yii \ caching \ WinCache : utiliza la extensión PHP WinCache.

  • yii \ redis \ Cache : implementa un componente de caché basado en la base de datos de Redis.

  • yii \ caching \ XCache : usa la extensión PHP XCache.

Todos los componentes de la caché admiten las siguientes API:

  • get () : recupera un valor de datos de la caché con una clave especificada. Se devolverá un valor falso si el valor de los datos está caducado / invalidado o no se encuentra.

  • add () : almacena un valor de datos identificado por una clave en la caché si la clave no se encuentra en la caché.

  • set () : almacena un valor de datos identificado por una clave en la caché.

  • multiGet () : recupera múltiples valores de datos de la caché con las claves especificadas.

  • multiAdd () : almacena varios valores de datos en la caché. Cada artículo está identificado por una clave. Si ya existe una clave en la caché, se omitirá el valor de los datos.

  • multiSet () : almacena varios valores de datos en la caché. Cada artículo está identificado por una clave.

  • existe () : devuelve un valor que indica si la clave especificada se encuentra en la caché.

  • flush () : elimina todos los valores de datos de la caché.

  • delete () : elimina un valor de datos identificado por una clave de la caché.

Un valor de datos almacenado en una caché permanecerá allí para siempre a menos que se elimine. Para cambiar este comportamiento, puede establecer un parámetro de vencimiento al llamar al método set () para almacenar un valor de datos.

Los valores de los datos almacenados en caché también pueden invalidarse mediante cambios cache dependencies -

  • yii \ caching \ DbDependency : la dependencia se cambia si se cambia el resultado de la consulta de la instrucción SQL especificada.

  • yii \ caching \ ChainedDependency : la dependencia se cambia si se cambia alguna de las dependencias de la cadena.

  • yii \ caching \ FileDependency : la dependencia se cambia si se cambia la última hora de modificación del archivo.

  • yii \ caching \ ExpressionDependency : la dependencia cambia si se cambia el resultado de la expresión PHP especificada.

Ahora, agregue el cache componente de la aplicación a su aplicación.

Step 1 - Modificar el config/web.php archivo.

<?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 - Agregar una nueva función llamada 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 en la barra de direcciones del navegador web, verá lo siguiente.

Step 4- Si vuelve a cargar la página, debería notar que la fecha no ha cambiado. El valor de la fecha se almacena en caché y el caché caducará en 30 segundos. Vuelva a cargar la página después de 30 segundos.

Almacenamiento en caché de consultas

El almacenamiento en caché de consultas le permite almacenar en caché el resultado de las consultas de la base de datos. El almacenamiento en caché de consultas requiere una conexión a la base de datos y el componente de aplicación de caché.

Step 1 - Agregar un nuevo método llamado 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());
}

En el código anterior, almacenamos en caché la consulta de la base de datos, agregamos un nuevo usuario y mostramos el recuento de usuarios.

Step 2 - Ir a la URL http://localhost:8080/index.php?r=site/query-caching y recarga la página.

Cuando abrimos la página por primera vez, almacenamos en caché la consulta DB y mostramos el recuento de todos los usuarios. Cuando recargamos la página, el resultado de la consulta de la base de datos en caché es el mismo que porque la consulta de la base de datos se almacena en caché.

Puede vaciar el caché de la consola usando los siguientes comandos:

  • yii cache - Muestra los componentes de caché disponibles.

  • yii cache/flush cache1 cache2 cache3 - Vacía los componentes de la caché cache1, cache2 y cache3.

  • yii cache/flush-all - Vacía todos los componentes de la caché.

Step 3 - Dentro de la raíz del proyecto de su aplicación se ejecuta ./yii cache/flush-all.