Yii - Cache

O cache é uma maneira eficaz de melhorar o desempenho de seu aplicativo. Os mecanismos de cache armazenam dados estáticos no cache e os obtêm do cache quando solicitados. No lado do servidor, você pode usar o cache para armazenar dados básicos, como uma lista das notícias mais recentes. Você também pode armazenar fragmentos de página ou páginas da web inteiras. No lado do cliente, você pode usar o cache HTTP para manter as páginas visitadas mais recentemente no cache do navegador.

Preparando o banco de dados

Step 1- Crie um novo banco de dados. O banco de dados pode ser preparado das duas maneiras a seguir.

  • No terminal, execute mysql -u root –p

    .
  • Crie um novo banco de dados via CREATE DATABASE helloworld CHARACTER SET utf8 COLLATE utf8_general_ci;

Step 2 - Configure a conexão do banco de dados no config/db.phpArquivo. A configuração a seguir é para o sistema usado atualmente.

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

Step 3 - Dentro da pasta raiz run ./yii migrate/create test_table. Este comando criará uma migração de banco de dados para gerenciar nosso banco de dados. O arquivo de migração deve aparecer nomigrations pasta da raiz do projeto.

Step 4 - Modifique o arquivo de migração (m160106_163154_test_table.php neste caso) desta forma.

<?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');
      }
   }
?>

A migração acima cria um usertabela com estes campos: id, nome e email. Ele também adiciona alguns usuários de demonstração.

Step 5 - Dentro da raiz do projeto run ./yii migrate para aplicar a migração ao banco de dados.

Step 6 - Agora, precisamos criar um modelo para o nosso usermesa. Para simplificar, vamos usar oGiiferramenta de geração de código. Abra issourl: http://localhost:8080/index.php?r=gii. Em seguida, clique no botão “Iniciar” sob o cabeçalho “Gerador de modelo”. Preencha o Nome da Tabela (“usuário”) e a Classe do Modelo (“MeuUsuário”), clique no botão “Visualizar” e por fim, clique no botão “Gerar”.

O modelo MyUser deve aparecer no diretório de modelos.

Cache de dados

O cache de dados ajuda você a armazenar variáveis ​​PHP no cache e recuperá-las posteriormente. O armazenamento em cache de dados depende de componentes de cache, que geralmente são registrados como componentes de aplicativo. Para acessar o componente do aplicativo, você pode chamarYii::$app → cache. Você pode registrar vários componentes do aplicativo de cache.

Yii suporta os seguintes armazenamentos de cache -

  • yii \ caching \ DbCache - Usa uma tabela de banco de dados para armazenar dados em cache. Você deve criar uma tabela conforme especificado em yii \ caching \ DbCache :: $ cacheTable.

  • yii \ caching \ ApcCache - Usa a extensão PHP APC.

  • yii \ caching \ FileCache - Usa arquivos para armazenar dados em cache.

  • yii \ caching \ DummyCache - Serve como um espaço reservado para cache que não faz nenhum cache real. O objetivo deste componente é simplificar o código que precisa verificar a disponibilidade do cache.

  • yii \ caching \ MemCache - Usa a extensão memcache do PHP.

  • yii \ caching \ WinCache - Usa a extensão PHP WinCache.

  • yii \ redis \ Cache - Implementa um componente de cache baseado no banco de dados Redis.

  • yii \ caching \ XCache - Usa a extensão XCache do PHP.

Todos os componentes do cache suportam as seguintes APIs -

  • get () - Recupera um valor de dados do cache com uma chave especificada. Um valor falso será retornado se o valor dos dados estiver expirado / invalidado ou não for encontrado.

  • add () - Armazena um valor de dados identificado por uma chave no cache se a chave não for encontrada no cache.

  • set () - Armazena um valor de dados identificado por uma chave no cache.

  • multiGet () - Recupera vários valores de dados do cache com as chaves especificadas.

  • multiAdd () - armazena vários valores de dados no cache. Cada item é identificado por uma chave. Se já existir uma chave no cache, o valor dos dados será ignorado.

  • multiSet () - armazena vários valores de dados no cache. Cada item é identificado por uma chave.

  • existe () - Retorna um valor indicando se a chave especificada foi encontrada no cache.

  • flush () - Remove todos os valores de dados do cache.

  • delete () - remove um valor de dados identificado por uma chave do cache.

Um valor de dados armazenado em um cache permanecerá lá para sempre, a menos que seja removido. Para alterar esse comportamento, você pode definir um parâmetro de expiração ao chamar o método set () para armazenar um valor de dados.

Os valores de dados em cache também podem ser invalidados por alterações do cache dependencies -

  • yii \ caching \ DbDependency - A dependência é alterada se o resultado da consulta da instrução SQL especificada for alterado.

  • yii \ caching \ ChainedDependency - A dependência é alterada se qualquer uma das dependências na cadeia for alterada.

  • yii \ caching \ FileDependency - A dependência é alterada se a hora da última modificação do arquivo for alterada.

  • yii \ caching \ ExpressionDependency - A dependência é alterada se o resultado da expressão PHP especificada for alterado.

Agora, adicione o cache componente de aplicativo para seu aplicativo.

Step 1 - Modifique o config/web.php Arquivo.

<?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 - Adicione uma nova função chamada actionTestCache() para o 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 na barra de endereço do navegador da web, você verá o seguinte.

Step 4- Se você recarregar a página, deverá notar que a data não mudou. O valor da data é armazenado em cache e o cache expirará em 30 segundos. Recarregue a página após 30 segundos.

Cache de consulta

O cache de consulta fornece o cache do resultado de consultas de banco de dados. O cache de consulta requer uma conexão de banco de dados e o componente de aplicativo de cache.

Step 1 - Adicione um novo método chamado actionQueryCaching() para o 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());
}

No código acima, armazenamos em cache a consulta do banco de dados, adicionamos um novo usuário e exibimos a contagem de usuários.

Step 2 - Vá para o URL http://localhost:8080/index.php?r=site/query-caching e recarregue a página.

Quando abrimos a página do primeiro, armazenamos em cache a consulta do banco de dados e exibimos a contagem de todos os usuários. Quando recarregamos a página, o resultado da consulta do banco de dados em cache é o mesmo porque a consulta do banco de dados é armazenada em cache.

Você pode limpar o cache do console usando os seguintes comandos -

  • yii cache - Mostra os componentes de cache disponíveis.

  • yii cache/flush cache1 cache2 cache3 - Libera os componentes do cache cache1, cache2 e cache3.

  • yii cache/flush-all - Libera todos os componentes do cache.

Step 3 - Dentro da raiz do projeto do seu aplicativo executado ./yii cache/flush-all.