- Создать экземпляр класса OutputCache и указать время кэширования:
$cache = new yii\base\OutputCache(['duration' => 3600]);
Yii::$app->view->on(yii\web\View::EVENT_BEFORE_RENDER, [$cache, 'start']);
Yii::$app->view->on(yii\web\View::EVENT_AFTER_RENDER, [$cache, 'end']);
После выполнения этих шагов содержимое страницы будет кэшироваться и отправляться клиенту только при последующих запросах в течение указанного времени. Это позволяет снизить нагрузку на сервер и увеличить производительность вашего приложения.
Увеличение производительности
Упрощение кода
Пример использования:
«`
Yii::$app->response->beginFlush();
echo ‘Этот текст будет автоматически отправлен в браузер’;
Yii::$app->response->endFlush();
«`
Это значительно упрощает код и избавляет от необходимости явного вызова метода send() для отправки данных.
«`
Yii::$app->response->beginFlush();
echo ‘Этот текст будет автоматически отправлен в браузер’;
Yii::$app->response->push(‘Дополнительные данные’);
Yii::$app->response->endFlush();
«`
В секции components
добавьте следующий код:
'view' => ['class' => 'yii\web\View','renderers' => ['html' => ['class' => 'yii\widgets\BogoViewRenderer',],],],
echo «<h3>Регистрация</h3>»; // сохраняем заголовок в буфер
$content = ob_get_clean(); // сохраняем буфер в переменную и очищаем его
$form = ActiveForm::begin(); // создаем форму
// код для формы
ActiveForm::end(); // закрываем форму
Пример кода:
public function actionIndex(){ob_start();// Код генерации контентаYii::$app->response->flushBuffer();// Остальной код действия// ...}
Пример | Описание |
---|---|
$content = Yii::$app->outputCache->start(); | |
echo 'Some content'; | |
Yii::$app->outputCache->end(); |
<?php $cachedContent = $this->beginCache('cacheId', ['duration' => 3600]); ?><h1>Cached Content</h1><p>Some cached content.</p><?php $this->endCache(); ?>
В данном примере контент внутри блока beginCache()
будет сохранен в буфере, и при следующем обращении к данному представлению будет выведен сохраненный контент вместо его генерации заново.
Пример 1: Кеширование сложных запросов
Yii2 предоставляет удобные инструменты для кеширования сложных запросов, чтобы уменьшить нагрузку на базу данных и ускорить время загрузки страницы.
Для кеширования сложных запросов в Yii2 можно использовать классы yii\caching\Cache
и yii\db\Query
. В этом примере мы рассмотрим, как кешировать список всех пользователей и их ролей.
- Инициализируйте объект кэша:
$cache = Yii::$app->cache;
- Проверьте, есть ли данные в кэше:
$data = $cache->get('users_with_roles');
- Если данные не найдены в кэше, выполните сложный запрос и сохраните результаты в кэше:
if ($data === false) {$data = (new Query())->select(['users.*', 'roles.name'])->from('users')->leftJoin('roles', 'users.role_id = roles.id')->all();$cache->set('users_with_roles', $data);}
- Используйте полученные данные в вашем коде:
foreach ($data as $user) {echo $user['username'] . ' - ' . $user['name'];}
Этот пример демонстрирует, как просто кешировать сложные запросы в Yii2. Вы можете изменить время жизни кэша, указав параметры при вызове методов set()
и get()
, чтобы обеспечить актуальность данных. Кеширование сложных запросов поможет снизить нагрузку на базу данных и повысить производительность вашего приложения.
Пример 2: Генерация больших файлов
Вот пример, демонстрирующий эту технику:
public function actionGenerateLargeFile(){ob_start();// Генерируем заголовок CSV-файлаecho "id,Имя,Фамилия";// Генерируем большой объем данныхfor ($i = 1; $i <= 1000000; $i++) {echo "$i,Иван,Иванов";}// Получаем данные из буфера и очищаем его$content = ob_get_clean();// Отдаем сгенерированный файл пользователюYii::$app->response->sendContentAsFile($content, 'large_file.csv', ['mimeType' => 'text/csv',]);}
Таким образом, мы можем генерировать и отправлять большие файлы без необходимости хранить их полностью в памяти сервера, что позволяет сэкономить ресурсы и повысить производительность приложения.