Кэширование блоков

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

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

Кэш блока можно использовать на других сайтах

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

Кстати, сайты для нескольких городов (так называемый многодоменный сайт) лучше сделать на основе одного сайта, используя в шаблонах конструкции вида:

  • Заказать окна в {{city}}
  • Звоните по телефону {{phone}}

Как включить кэширование блока

Кэширование блока включается в окне редактирования блока в пункте меню: "Блок > Настройки блока" в разделе "Кэширование блока". Нежелательно применять кеширование блока, если имеются запросы к блоку, например пагинация блока (параметр part).

Файл кэша

Файл кэша имеет следующие особенности:

  • Кэш-файл хранится в папке сайта "cached-blocks" и имеет имя такого вида "99.htm", где 99 — это номер блока.
  • В кэш-файле записан чистый html-код, кроме небольшого фрагмента php-кода для подключения штатных файлов шаблона *.css, *.js с помощью методов Blox::addToHead() и Blox::addToFoot().
  • Кэш-файл работает только в режиме посетителя, в режиме редактирования работает штатный шаблон *.tpl.
  • Непосредственно кэш-файл создается или обновляется не сразу после редактирования блока, а после посещения страницы пользователем без прав редактирования блока или в режиме посетителя.

Кэш-файл обновляется после редактирования блока при посещении страницы в режиме посетителя.

URL страниц и файлов

Сам HTML код, в частности, URL страниц и файлов в кэш-файле не изменяются. Поэтому, если вы хотите использовать кэши на ведомых сайтах, то URL картинок в шаблонах лучше делать абсолютными (должны начинаться с "http://").

URL внутренних страниц, напротив, нужно делать относительными. При этом, сайт лучше переключить в режим ЧПУ, так как ЧПУ ссылки страниц на ведомом сайте можно всегда сделать такими же, как и на головном сайте.

Как использовать кэш блока на ведомом сайте

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

text-cached.tpl

<?php
# Чтение и вывод кэш-файла из головного сайта
echo file_get_contents('/var/www/site2.com/cached-blocks/99.htm');
?>

Если в кэше есть php-код, нужно сначал буферизовать вывод:

text-cached.tpl

<?php
ob_start();
require'/var/www/site2.com/cached-blocks/99.htm';
echo ob_get_clean();
?>

Особенности подключения дополнительных файлов *.css и *.js

  • Как указывалось выше, штатные файлы шаблона *.css, *.js подключаются автоматически, поэтому нежелательно эти файлы подключать как-то по-другому.
  • Если в исходном шаблоне все же производится подключение файлов *.css и *.js с помощью методов Blox::addToHead() и Blox::addToFoot(), то строки такого кода нужно вынести в файл предобработчика шаблона (tplh).
  • В ведомом шаблоне придется также осуществить подключение этих *.css, *.js файлов. Можно использовать файлы из ведомого и файлы головного сайта. Второй вариант можно осуществить, например, используя сам предобработчик (tplh), и учтя все входные данные конкретного голового блока, например:

text-cached.tpl

<?php
# Подключение файлов *.css и *.js на странице ведомого сайта
$hfile = '/var/www/site2.com/templates/text.tplh'; // Файл предобработчика на головном сайте
if (file_exists($hfile)) {
    (function($prehandlerFile){
        $block = 99;
        $xdat = [2=>220,4=>6];
        require $prehandlerFile;    
    })($hfile);
}

# Вывод блока
$cfile = '/var/www/site2.com/cached-blocks/99.htm'; // Кэш-файл на головном сайте
if (file_exists($cfile)) {
    ob_start();
    require $cfile;
    echo ob_get_clean();
}
?>

См. также