Накопление большого объема баз данных влечет проблемы с производительностью сайта. Основной на то причиной является медленная обработка запросов. Здесь поможет многоуровневое кэширование. Кэш Битрикс имеет много сложных особенностей, из-за чего работать с ним не так просто. Перед работой необходимо внимательно ознакомиться с основными его параметрами.
Что такое кэш и для чего нужно кэширование?
Кэш представляет собой специальное хранилище, в который попадают результаты работы ресурсоемких или редко обновляемых частей кода. Благодаря кэшированию сайты функционируют быстрее, что положительно сказывается на SEO и повышает удовлетворенность пользователей.
Когда браузер запрашивает веб-страницу, сервер выполняет множество сложных вычислений. Он находит последние записи, генерирует подвал и шапку сайта, ищет виджеты боковых панелей и т.д. Кэширование позволяет запомнить окончательный результат и не обрабатывать каждый запрос по отдельности.
Сайт, собранный и реализованный надлежащим образом, загружается всего за пару секунд. Но даже в этом случае следует использовать кэширование. Так вы сократите время загрузки, где каждая секунда сказывается на уровне конверсии.
1С-Битрикс имеет производительную систему кэширования. Она применяется в стандартных компонентах Битрикс, но может использоваться при самостоятельной разработке. Основная ее задача – понизить время отклика сайта и увеличить его устойчивость при нагрузках. Для реализации кэширования в системе есть два класса:
- CPageCache — для кэширования HTML результата выполнения скрипта.
- CPHPCache — для кэширования HTML и PHP переменных.
Каждый класс имеет несколько собственных методов.
CPhpCache
Класс CPhpCache, необходимый для кэширования PHPпеременных и HTMLрезультата реализации скрипта, включает 8 основных методов:
- StartDataCache. Этот метод ответственен за инициализацию механизма кэширования и запуск буферизации. Вторая функция — вывод содержимого из кэша.
- EndDataCache. Сохраняет PHP переменные файлы кэша и буферизированный HTML.
- InitCache. Подготавливает механизм кэширования. Выполняет проверку на наличие валидного и неистекшего файла кэша. При обнаружении такого файла происходит его подключение.
- GetVars. Ответственен за возвращение PHP переменных, сохраненных в кэше.
- Output. Выводит результат, сохраненный в кэше HTML.
- IsCacheExpired. Этот метод доступен с версии Битрикс 3.3.7. Проверяет продолжительность жизни кэша.
- CleanDir. Доступен с версии 8.5.1. Ответственнен за очистку кэша по параметру basedir.
- AbortDataCache. Отменяет создание текущего кэша.
Пример кэширования HTMLи PHPпеременных выглядит следующим образом:
GetUserGroupString(); // если кэш есть и он ещё не истек то if($obCache->InitCache($life_time, $cache_id, "/")): // получаем закэшированные переменные $vars = $obCache->GetVars(); $SECTION_TITLE = $vars["SECTION_TITLE"]; else : // иначеобращаемсякбазе $arSection = GetIBlockSection($SECTION_ID); $SECTION_TITLE = $arSection["NAME"]; endif; // добавляем пункт меню в навигационную цепочку $APPLICATION->AddChainItem($SECTION_TITLE, $SECTION_URL."SECTION_ID=".$SECTION_ID); // начинаем буферизирование вывода if($obCache->StartDataCache()): // выбираем из базы параметры элемента инфоблока if($arIBlockElement = GetIBlockElement($ELEMENT_ID, $IBLOCK_TYPE)): echo"<pre>"; print_r($arIBlockElement); echo"</pre>" endif; // записываем предварительно буферизированный вывод в файл кэша // вместе с дополнительной переменной $obCache->EndDataCache(array( "SECTION_TITLE" => $SECTION_TITLE )); endif; ?>
Здесь кэшируется HTMLи PHP переменная $SECTION_TITLE. Тип и структура PHP переменных произвольные.
Что следует делать для отключения кэша на одной странице? Авторизуйтесь с административными правами и вызовите нужную страницу параметром
&clear_cache=Y (переменная clear_cache_session). Чтобы отключить кэш для всех страниц, просмотренных в рамках сессии, вызовите любую страницу параметром &clear_cache_session=Y.
CPageCache
Этот класс использует все те же методы, что и CPhp, за исключением GetVars, CleanDir и AbortDataCache. Пример кэширования HTML с помощью класса CpageCache выглядит следующим образом:
GetUserGroupString(); // инициализируембуферизированиевывода if($obCache->StartDataCache($life_time, $cache_id, "/")): // выбираем из базы параметры элемента инфоблока if($arIBlockElement = GetIBlockElement($ELEMENT_ID, $IBLOCK_TYPE)): echo"<pre>"; print_r($arIBlockElement); echo"</pre>" endif; // записываем предварительно буферизированный вывод в файл кэша $obCache->EndDataCache(); endif; ?>
Метод StartDataCache ищет валидный и не истекший файл кэша, подключает его и выводит на экран. В ином случае включается буферизация. Задается интервал времени в секундах, в течение которого файл кэша будет не истекшим и валидным. Ее результаты записываются в файл кэша методом EndDataCache. Этот же параметр сохраняет идентификатор конкретного экземпляра кэша. Если какие-то переменные способны повлиять на итог выполнения кэшируемого кода, то их значения включаются в этот идентификатор.
Почему разрастается папка кэша?
Результаты кэширования сохраняются в виде файлов в каталоге /bitrix/cache/. Если время кэширования не истекло, то вместо ресурсоемкого кода подключается заранее созданный файл кэша. Однако следует помнить, что неразумное использование кэширования приведет к серьезному разрастанию размера каталога /bitrix/cache/. Что делать в такой ситуации? Для начала стоит разобраться с основными причинами.
Очень большой и сложный сайт
Одной из причин увеличения объема папки кэша может быть большой вес вашего сайта. Допустим, интернет-магазин имеет 10 тысяч товаров в одной категории. При этом на одной странице размещено 10 товаров, а ее вес составляет 10Кб кэша. Если кэшировать каждую страницу по отдельности, то размер данных будет слишком большим. При 10 тыс. единиц по 10Кб получится 100Мб. При этом размер может быть и больше – тут все зависит от типа и особенностей верстки.
Если подключено два вида отображения товаров (например, списком и плиткой), то размер кэша увеличится вдвое. Не стоит забывать и про фильтр, результаты которого также кэшируются. Получается больше 200 Мб на один только каталог при малом размере кэша.
Если у вас сложный и объемный сайт, то проблема разрастания папки кэша решается двумя способами. Первый – выбор правильного времени кэширования, второй – увеличение дискового пространства.
Неправильно определено время кэширования
Вторая популярная проблема связана с неграмотным расчетом времени кэширования. Допустим, у вас установлено время жизни кэша на 3 месяца. При этом за все это время на него никто не зашел. Особенно это проблемно при объемном кэше. Например, его размер – от 500Кб до 1 Мб. Храниться он будет довольно долго, даже если к нему не было обращения.
Решение тут простое: нужно грамотно подобрать время кэширования и расставить параметры компонентов. Возможно, время придется сократить, а некоторые данные и вовсе не кэшировать.
Неправильно настроен кэш собственных или битриксовых компонентов
Чтобы не возникало проблем с объемами данных, заранее проверяйте параметры кэширования в компонентах. Ошибки могут быть как в собственных, так и в стандартных настройках. Внимательно изучите, на основе чего формируются собственные компоненты. В некоторых случаях их придется переписать.
Простой пример: передаваемые кэшу данные меню начнут сильно увеличиваться в объемах и кэшироваться на длительное время, если в Битриксе указать MENU_CACHE_VARS. Этот метод создает кэш под каждый набор параметров.
Ошибка с механизмом очищения кэша
Еще одна причина разрастания данных, которая решается сокращением времени кэширования и проверкой всех параметров. Например, кэш не успевает удаляться, из-за чего накапливается в больших объемах. Как следствие – порождение дублей одного и того же кэша в разных компонентах.
Как сбросить кэш?
Чтобы почистить кэш Битрикс, необходимо зайти в панель администратора, раздел «Автокэширование» — «очистка файлов кэша». Далее нужно удалить все файлы в папке /bitrix/cache/.
Очистка файлов кэша в Битрикс
Второй вариант – удаление данных в панели инструментов для конкретной страницы:
Удаление кэша для конкретной страницы в Битрикс
Наконец, в настройках компонента для конкретного компонента:
Настройка кэша компонента в Bitrix
Для композитного сайта можно сбросить кэш в разделе «Настройки» — «Настройки продукта» — «Композитный сайт» — «Страницы».
Об особенностях внедрения этой технологии мы писали в статье об оптимизации сайта на «Битриксе».
Есть еще один, более простой вариант действий для сбрасывания кэша. Нужно выполнить PHP-код:
$obCache = newCPHPCache(); $obCache->CleanDir();
Все файлы кэша Битрикс будут промаркированы на удаление. Пути к файлам кэша изменятся, а значит, весь старый кэш сайта попросту не будет восприниматься. Это можно считать за моментальную очистку кэша. Останется лишь удалить указанные файлы.
Основным преимуществом такого метода считается отсутствие необходимости держать окно браузера открытым и ждать полного удаления файлов. Система ликвидирует их порционно, по несколько файлов за итерацию.
Настройка кэширования сайта
Система Bitrix включает разные технологии кэширования:
- Автокэширование. Динамические компоненты, используемые для создания веб-страниц, имеют встроенную поддержку управления кэшированием. Технология включается соответствующей кнопкой на административной панели.
- Неуправляемое кэширование. Дает возможность установить правила кэширования ресурсоемких частей страниц. Результаты кэширования сохранятся в виде файлов в каталоге bitrix/cache/. Кэш здесь не перестраивается автоматически после модификации исходных данных, а действует в течение определенного времени после создания. В связи с этим он и называется неуправляемым.
- Управляемое кэширование. Кэшированные данные обновляются незаметно для пользователя. Происходит это по мере обновления первичных данных, то есть управляются они самими данными. Такая технология используется в основном ядре продукта.
- Кэширование меню. Здесь используется специальный алгоритм, учитывающий, что большинство посетителей — это незарегистрированные пользователи. Кэш меню управляемый. Оно обновится, если отредактировать меню или изменить права доступа к файлам и папкам через API и административный интерфейс.
Отдельно следует обозначить кэширование графических файлов и HTML кэширование.