Кэширование
MV позволяет кэшировать данные для быстрого извлечения. Обычно кэшируются фрагменты кода, полученные в результате большого количества SQL запросов и затрат на обработку данных. Например, можно кэшировать вложенные меню, либо списки элементов, в которых выстроены сложные связи между несколькими таблицами.
В результате фрагмент кода сохраняется в базе данных, и для его извлечения требуется всего один запрос, вместо многих запросов, потраченных на его первичную генерацию.
Для включения возможности кэширования необходимо поставить опцию 'EnableCache' в значение true в файле config/setup.php.
Кэширование на время
//Сохранить строку с ключом 'greeting' на 100 секунд
$mv -> cache -> save('greeting', 'Hello world!', 100);
//Проверить кэш по ключу
if(null !== $value = $mv -> cache -> find('greeting'))
{
...
}
Сброс кэша происходит при каждой операции с любой из записей модели, привязанной к ключу кэша.
Кэширование c привязкой к админке
Сброс кэша можно привязать к операциям в админке. Когда происходит CRUD операция в одной или нескольких моделях кэш будет сброшен.
//Сохранить строку с ключом 'hello' и очищать его при любом действии с моделями
$mv -> cache -> save('hello', 'Hello world!', '*');
//Очищать кэш при любом действии с моделью Pages
$mv -> cache -> save('hello', 'Hello world!', ['Pages']);
//Очищать кэш при любом действии с несколькими моделями
$mv -> cache -> save('hello', 'Hello world!', ['Pages', 'News', 'GiftsPromo']);
Кэширование результата метода
Предположим в модели Catalogs имеется метод displayLeftCatalogMenu(), который отображает дерево категорий и использует на это много SQL запросов. Необходимо закэшировать результат метода в шаблоне для ускорения генерации страницы. Очищать кэш нужно только при изменениях в модели Catalogs. Модифицируем код в шаблоне, отвечающий за отображение каталога.
//Файл шаблона в папке views/...
//До кэширования
echo $mv -> catalogs -> displayLeftCatalogMenu();
//После применения кэширования
if(!$mv -> cache -> findAndDisplay('catalog-menu'))
echo $mv -> cache -> save('catalog-menu',
$mv -> catalogs -> displayLeftCatalogMenu(),
['Catalogs']);
Если имеется фрагмент шаблона, который генерируется из нескольких моделей, то необходимо закэшировать данный фрагмент кода и очищать его при изменении данных в любой из участвующих моделей.
//Привязка очистки кэша к действиям в админке в нескольких моделях
if(!$mv -> cache -> findAndDisplay('something'))
echo $mv -> cache -> save('something',
$mv -> pages -> displaySomething(),
['Pages', 'Catalogs', 'News']);
Кэширование media файлов
MV может сжимать большое количество CSS и JS файлов в один, значительно уменьшая при этом количество запросов к серверу со стороны браузера.
//Файл views/main-header.php до кэширования
<link rel="stylesheet" type="text/css" href="<? echo $mv -> media_path; ?>css/style.css" />
<link rel="stylesheet" type="text/css" href="<? echo $mv -> media_path; ?>css/catalog.css" />
<script type="text/javascript" src="<? echo $mv -> media_path; ?>js/jquery.js"></script>
<script type="text/javascript" src="<? echo $mv -> media_path; ?>js/utils.js"></script>
//После кэширования
<?
CacheMedia::instance();
CacheMedia::addCssFile(['style.css', 'сatalog.css']);
CacheMedia::addJavaScriptFile(['jquery.js', 'utils.js']);
if(...)
CacheMedia::addCssFile('style-special.css');
//Это условие не обязательно
if(Http::isLocalHost())
echo CacheMedia::getInitialFiles();
else
echo CacheMedia::getAllCache();
?>
Если в каком-либо шаблоне идет дополнительное включение файлов в media кэш, то их необходимо добавлять до включения файла main-header.php.
CacheMedia :: addJavaScriptFile([
'request.js',
'media/jquery-ui/jquery-ui.min.js'
]);
CacheMedia :: addCssFile([
'media/jquery-ui/jquery-ui.min.css',
'media/jquery-ui/jquery-ui.structure.min.css',
'media/jquery-ui/jquery-ui.theme.min.css'
]);
include $mv -> views_path.'main-header.php';
Примечания
- Оценить эффективность кэширования можно по количеству SQL запросов и времени генерации страницы. Для этого используется отладочная панель. Для ее отображения нужно поставить настройку ‘DebugPanel’ равной true в файле config/setup.php. Панель появляется внизу страницы.
- Данные кэширования хранятся в базе данных в таблицах cache и cache_clean, которые могут быть очищены в любой момент без ущерба для работы проекта. Также кэш можно сбросить статическим методом Cache::cleanAll().
- В объекте $mv -> cache есть методы cleanByKey($key) и cleanByModel($model) для очистки кэша по ключу или названию модели, за которой он закреплен.
- Значение опции 'EnableCache', выставленное в false полностью останавливает сохранение и отдачу данных из кэша.
Предыдущий раздел
Плагины