Документация

Начало работы

Модели (models)

Шаблоны (views) и маршрутизация (routes)

Формы

SQL запросы

Сессии и безопасность

Плагины

Кэширование

MV позволяет кэшировать данные для быстрого извлечения. Обычно кэшируются фрагменты кода, полученные в результате большого количества SQL запросов и затрат на обработку данных. Например, можно кэшировать большие вложенные меню, либо списки элементов, в которых выстроены сложные связи между многими таблицами. В результате фрагмент кода сохраняется в базе данных, и для его извлечения требуется всего 1 запрос, вместо многих запросов, потраченных на его первичную генерацию.

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

Для включения возможности кэширования необходимо поставить опци. 'EnableCache' в значение true в файле config/setup.php.

Кэширование результата работы метода

Предположим в модели Catalogs имеется метод displayLeftCatalogMenu(), который отображает дерево категорий и использует на это много SQL запросов. Необходимо закэшировать результат метода в шаблоне для ускорения генерации страницы. Очищать кэш нужно только при изменениях в модели Catalogs. Модифицируем код в шаблоне, отвечающий за отображение каталога.

//До кэширования
<ul id="catalog-menu-list">
    <? echo $mv -> catalogs -> displayLeftCatalogMenu(); ?>
</ul>

//После применения кэширования
<ul id="catalog-menu-list">
    <?
        if(!$mv -> cache -> findAndDisplay("catalog-menu"))
            echo $mv -> cache -> save("catalog-menu", $mv -> catalogs -> displayLeftCatalogMenu(), array("catalogs"));
    ?>
</ul>

Кэширование фрагмента шаблона с HTML и PHP кодом

Имеется фрагмент шаблона, который генерируется из нескольких моделей. Необходимо закэшировать данный фрагмент кода и очищать его при изменении данных в любой из участвующих моделей.
//До кэширования
<div id="bottom-block">
    <? echo $mv -> blocks -> display(); ?>
    <div class="catalog">
        <? echo $mv -> catalogs -> displayMainMenu(); ?>
    </div>
    <? echo $mv -> pages-> displayMenu(); ?>
</div>

//После применения кэширования
<? if(!$mv -> cache -> displayOrStart("footer")) { ?>
<div id="bottom-block">
    <? echo $mv -> blocks -> display(); ?>
    <div class="catalog">
        <? echo $mv -> catalogs -> displayMainMenu(); ?>
    </div>
    <? echo $mv -> pages-> displayMenu(); ?>
</div>
<? } $mv -> cache -> stopAndSave(array("blocks", "catalogs", "pages")); ?>

Примечания

  • Проследить эффективность кэширования можно по количеству SQL запросов и времени генерации страницы. Для отображения такого отчета необходимо в корневом файле index.php поставить значение 1 в нулевой аргумент при создании объекта $debug, как описано в разделе Отладка. Отчет появляется внизу сгенерированной страницы.
  • Данные кэширования хранятся в базе данных в таблицах cache и cache_clean, которые могут быть очищены в любой момент без ущерба для работы проекта. Также кэш можно сбросить статическим методом Cache :: cleanAll().
  • Если в методы save() и stopAndSave() не передавать массив с моделями, то MV будет сбрасывать кэш по заданному ключу при любой операции с любой записью в любой модели.
  • В объекте $mv -> cache есть методы cleanByKey($key) и cleanByModel($model) для очистки кэша по ключу или названию модели, за которой он закреплен.
  • Значение опции 'EnableCache', выставленное в false полностью останавливает сохранения и отдачу данных из кэша.

Предыдущий раздел

AJAX

Следующий раздел

Безопасность