Битрикс: работа с композитным кешем.
Последние записи
Сперва идем в /bitrix/admin/composite.php?lang=ru
и открываем пункт Настройки
. Таких настроек будет достаточно:
Включаем логирование
define( "BX_COMPOSITE_DEBUG", true );
define( "LOG_FILENAME", $_SERVER["DOCUMENT_ROOT"]."/log.txt" );
Динамический контент вне компонента, например в шаблоне
\Bitrix\Main\Page\Frame::getInstance()->startDynamicWithID("dynamic-area");
\Bitrix\Main\Page\Frame::getInstance()->finishDynamicWithID("dynamic-area", "Загрузка...");
Динамический контент с буферизацией
$frame = new \Bitrix\Main\Page\FrameHelper("dynamic-area");
$frame->begin();
//динамический контент
$frame->beginStub();
//заглушка
$frame->end();
Динамическая область с кешем браузера. Подгружает статику с прошлого хита
$frame=$this->createFrame('dynamic-area')->begin('');
$frame->setBrowserStorage(true);
//Content
$frame->end();
Динамическая область с анимацией появления
$frame = $this->createFrame('dynamic-area')->begin('');
$frame->setAnimation(true);
//Content
$frame->end();
Неполное кеширование компонента. Например при показе актуальной цены
$frame = $this->createFrame('price-index', false)->begin()
echo $price;
$frame->beginStub()
echo 'руб.';
$frame->end()
Отключение композитного кеширования
\Bitrix\Main\Data\StaticHtmlCache::getInstance()->markNonCacheable();
Удаление композитного кеша через API
$staticHtmlCache = \Bitrix\Main\Data\StaticHtmlCache::getInstance();
$staticHtmlCache->deleteAll();
Композит и содержимое зависящее от региона
В файле init.php переопределяем метод, формирующий имя файла в композитном кэше.
class CacheProvider extends Bitrix\Main\Data\StaticCacheProvider
{
public static function createKey()
{
global $USER;
$page_name = "page";
if(!empty($_SESSION["CITY_ID"]))
$page_name .= "_region_".$_SESSION["CITY_ID"];
return $page_name;
}
public function setUserPrivateKey(){}
public function isCacheable()
{
return true;
}
public function getCachePrivateKey()
{
return self::createKey();
}
public function onBeforeEndBufferContent(){}
}
В компоненте определения города (например articul.geolocation.detect_ip/component.php
) записываем куку BITRIX_SM_PK
setcookie("BITRIX_SM_PK", 'page_region_'.$_SESSION["CITY_ID"], $cookie_life, "/", constant("COOKIE_DOMAIN"));
В файле /local/php_interface/composite_first_start_cookie_fix.php
записываем куку BITRIX_SM_PK
для того, чтобы при первом визите композит тоже отрабатывал (подключаем этот файл ДО header.php
на страницах с композитом):
Оригинал решения здесь
Стоит ознакомиться:
Комментарии