Учебники

Yii — Кеширование

Кэширование — это эффективный способ повысить производительность вашего приложения. Механизмы кэширования хранят статические данные в кеше и получают их из кеша по запросу. На стороне сервера вы можете использовать кеш для хранения основных данных, таких как список самых последних новостей. Вы также можете хранить фрагменты страниц или целые веб-страницы. На стороне клиента вы можете использовать HTTP-кэширование, чтобы сохранить последние посещенные страницы в кэше браузера.

Подготовка БД

Шаг 1 — Создайте новую базу данных. База данных может быть подготовлена ​​следующими двумя способами.

  • В терминале запустите mysql -u root –p

    ,

  • Создать новую базу данных с помощью CREATE DATABASE helloworld CHARACTER SET utf8 COLLATE utf8_general_ci;

В терминале запустите mysql -u root –p

Создать новую базу данных с помощью CREATE DATABASE helloworld CHARACTER SET utf8 COLLATE utf8_general_ci;

Шаг 2 — Настройте соединение с базой данных в файле config / db.php . Следующая конфигурация предназначена для системы, используемой в настоящее время.

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

Шаг 3 — Внутри корневой папки запустите ./yii migrate / create test_table . Эта команда создаст миграцию базы данных для управления нашей БД. Файл миграции должен появиться в папке миграций корня проекта.

Шаг 4. Измените файл миграции (в данном случае m160106_163154_test_table.php ).

<?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", "user1@gmail.com"],
            ["User2", "user2@gmail.com"],
            ["User3", "user3@gmail.com"],
            ["User4", "user4@gmail.com"],
            ["User5", "user5@gmail.com"],
            ["User6", "user6@gmail.com"],
            ["User7", "user7@gmail.com"],
            ["User8", "user8@gmail.com"],
            ["User9", "user9@gmail.com"],
            ["User10", "user10@gmail.com"],
            ["User11", "user11@gmail.com"],
         ]);
      }
      public function safeDown() {
         $this->dropTable('user');
      }
   }
?>

Вышеуказанная миграция создает пользовательскую таблицу со следующими полями: id, name и email. Также добавлено несколько демо-пользователей.

Шаг 5 — Внутри проекта запустите ./yii Миграция, чтобы применить миграцию к базе данных.

Шаг 6 — Теперь нам нужно создать модель для нашей пользовательской таблицы. Для простоты мы собираемся использовать инструмент генерации кода Gii . Откройте этот URL: http: // localhost: 8080 / index.php? R = gii . Затем нажмите кнопку «Пуск» под заголовком «Генератор моделей». Заполните Имя таблицы («пользователь») и Класс модели («MyUser»), нажмите кнопку «Предварительный просмотр» и, наконец, нажмите кнопку «Создать».

Кеширование Подготовка БД

Модель MyUser должна появиться в каталоге моделей.

Кеширование данных

Кэширование данных помогает вам хранить переменные PHP в кеше и получать их позже. Кэширование данных основывается на компонентах кеша, которые обычно регистрируются как компоненты приложения. Чтобы получить доступ к компоненту приложения, вы можете вызвать Yii :: $ app → cache . Вы можете зарегистрировать несколько кеш-приложений.

Yii поддерживает следующие кеш-хранилища:

  • yii \ caching \ DbCache — использует таблицу базы данных для хранения кэшированных данных. Вы должны создать таблицу, как указано в yii \ caching \ DbCache :: $ cacheTable.

  • yii \ caching \ ApcCache — использует расширение PHP APC.

  • yii \ caching \ FileCache — использует файлы для хранения кэшированных данных.

  • yii \ caching \ DummyCache — служит заполнителем кэша, который не выполняет реального кэширования. Цель этого компонента — упростить код, который должен проверять доступность кэша.

  • yii \ caching \ MemCache — использует расширение PHP memcache.

  • yii \ caching \ WinCache — использует расширение PHP WinCache.

  • yii \ redis \ Cacheреализует компонент кэша на основе базы данных Redis.

  • yii \ caching \ XCache — использует расширение PHP XCache.

yii \ caching \ DbCache — использует таблицу базы данных для хранения кэшированных данных. Вы должны создать таблицу, как указано в yii \ caching \ DbCache :: $ cacheTable.

yii \ caching \ ApcCache — использует расширение PHP APC.

yii \ caching \ FileCache — использует файлы для хранения кэшированных данных.

yii \ caching \ DummyCache — служит заполнителем кэша, который не выполняет реального кэширования. Цель этого компонента — упростить код, который должен проверять доступность кэша.

yii \ caching \ MemCache — использует расширение PHP memcache.

yii \ caching \ WinCache — использует расширение PHP WinCache.

yii \ redis \ Cacheреализует компонент кэша на основе базы данных Redis.

yii \ caching \ XCache — использует расширение PHP XCache.

Все компоненты кеша поддерживают следующие API —

  • get () — извлекает значение данных из кэша с указанным ключом. Ложное значение будет возвращено, если значение данных истекло / признано недействительным или не найдено.

  • add () — Сохраняет значение данных, идентифицированных ключом, в кеше, если ключ не найден в кеше.

  • set () — хранит значение данных, идентифицированных ключом, в кеше.

  • multiGet ()извлекает несколько значений данных из кэша с указанными ключами.

  • multiAdd () — хранит несколько значений данных в кеше. Каждый элемент идентифицируется ключом. Если ключ уже существует в кэше, значение данных будет пропущено.

  • multiSet () — хранит несколько значений данных в кеше. Каждый элемент идентифицируется ключом.

  • exist () — возвращает значение, указывающее, найден ли указанный ключ в кэше.

  • flush () — удаляет все значения данных из кэша.

  • delete () — удаляет значение данных, идентифицированное ключом, из кэша.

get () — извлекает значение данных из кэша с указанным ключом. Ложное значение будет возвращено, если значение данных истекло / признано недействительным или не найдено.

add () — Сохраняет значение данных, идентифицированных ключом, в кеше, если ключ не найден в кеше.

set () — хранит значение данных, идентифицированных ключом, в кеше.

multiGet ()извлекает несколько значений данных из кэша с указанными ключами.

multiAdd () — хранит несколько значений данных в кеше. Каждый элемент идентифицируется ключом. Если ключ уже существует в кэше, значение данных будет пропущено.

multiSet () — хранит несколько значений данных в кеше. Каждый элемент идентифицируется ключом.

exist () — возвращает значение, указывающее, найден ли указанный ключ в кэше.

flush () — удаляет все значения данных из кэша.

delete () — удаляет значение данных, идентифицированное ключом, из кэша.

Значение данных, хранящееся в кэше, останется там навсегда, если оно не будет удалено. Чтобы изменить это поведение, вы можете установить параметр срока действия при вызове метода set () для хранения значения данных.

Значения кэшированных данных также могут быть признаны недействительными из-за изменений зависимостей кэша

  • yii \ caching \ DbDependency — зависимость изменяется, если изменяется результат запроса указанного оператора SQL.

  • yii \ caching \ ChainedDependency — зависимость изменяется при изменении какой-либо из зависимостей в цепочке.

  • yii \ caching \ FileDependency — зависимость изменяется при изменении времени последнего изменения файла.

  • yii \ caching \ ExpressionDependency — зависимость изменяется, если изменяется результат указанного выражения PHP.

yii \ caching \ DbDependency — зависимость изменяется, если изменяется результат запроса указанного оператора SQL.

yii \ caching \ ChainedDependency — зависимость изменяется при изменении какой-либо из зависимостей в цепочке.

yii \ caching \ FileDependency — зависимость изменяется при изменении времени последнего изменения файла.

yii \ caching \ ExpressionDependency — зависимость изменяется, если изменяется результат указанного выражения PHP.

Теперь добавьте компонент приложения кеша в ваше приложение.

Шаг 1измените файл config / web.php .

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

Шаг 2 — Добавьте новую функцию actionTestCache () в 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);
}

Шаг 3 — Введите http: // localhost: 8080 / index.php? R = site / test-cache в адресной строке веб-браузера, вы увидите следующее.

Тестовый кеш

Шаг 4 — Если вы перезагрузите страницу, вы должны заметить, что дата не изменилась. Значение даты кэшируется, и срок действия кэша истекает в течение 30 секунд. Перезагрузите страницу через 30 секунд.

Дата Значение Кэшируется

Кэширование запросов

Кэширование запросов обеспечивает кэширование результатов запросов к базе данных. Для кеширования запросов требуется соединение с БД и компонент приложения кеша.

Шаг 1 — Добавьте новый метод с именем actionQueryCaching () в 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 = "cacheduseremail@gmail.com";
   $user->save();
   echo "==========";
   var_dump(MyUser::find()->count());
}

В приведенном выше коде мы кешируем запрос к базе данных, добавляем нового пользователя и отображаем количество пользователей.

Шаг 2. Перейдите по URL-адресу http: // localhost: 8080 / index.php? R = site / query-caching и перезагрузите страницу.

Кэширование запросов

Когда мы открываем страницу для первого, мы кешируем запрос БД и показываем количество всех пользователей. Когда мы перезагружаем страницу, результат запроса в кешированную базу данных остается таким же, каким он был, потому что запрос к базе данных кэшируется.

Вы можете очистить кеш из консоли, используя следующие команды —

  • yii cache — показывает доступные компоненты кеша.

  • yii cache / flush cache1 cache2 cache3 — Очищает компоненты кэша cache1, cache2 и cache3.

  • yii cache / flush-all — очищает все компоненты кеша.

yii cache — показывает доступные компоненты кеша.

yii cache / flush cache1 cache2 cache3 — Очищает компоненты кэша cache1, cache2 и cache3.

yii cache / flush-all — очищает все компоненты кеша.

Шаг 3 — Внутри корня проекта вашего приложения запустите ./yii cache / flush-all .