Виды кеширования в Битрикс

1. Файловый кеш (через `CPHPCache`)
Идеально для кеширования HTML-фрагментов или данных, которые редко меняются.
use CPHPCache;

// Данные для кеширования
$pageUrl = '/blog/post-1/';
$cacheId = 'opengraph_meta_' . md5($pageUrl); // Уникальный ID кеша
$cacheDir = '/dev2fun/opengraph/'; // Папка в /bitrix/cache/
$cacheTime = 3600; // Время жизни (1 час)

$cache = new CPHPCache();
if ($cache->InitCache($cacheTime, $cacheId, $cacheDir)) {
    // Данные есть в кеше
    $metaData = $cache->GetVars();
} elseif ($cache->StartDataCache()) {
    // Генерация данных
    $metaData = [
        'title' => 'Заголовок для соцсетей',
        'image' => '/upload/og_image.jpg',
    ];

    // Сохраняем в кеш
    $cache->EndDataCache($metaData);
}

// Использование:
echo $metaData['title'];
2. Управляемый кеш (`ManagedCache`)
Оптимален для частого обращения к данным в рамках одного запроса.
use Bitrix\Main\Data\ManagedCache;

$managedCache = new ManagedCache();
$cacheKey = 'opengraph_settings'; // Уникальный ключ
$cacheTime = 86400; // 24 часа

// Проверяем кеш
if ($managedCache->read($cacheTime, $cacheKey)) {
    $settings = $managedCache->get($cacheKey);
} else {
    // Генерация данных
    $settings = [
        'default_title' => \Bitrix\Main\Config\Option::get('dev2fun.opengraph', 'default_title'),
        'default_image' => \Bitrix\Main\Config\Option::get('dev2fun.opengraph', 'default_image'),
    ];

    // Сохраняем в кеш
    $managedCache->set($cacheKey, $settings);
}

// Использование:
echo $settings['default_title'];
3. Тегированный кеш
Полезен, когда нужно сбросить кеш для группы связанных данных.
use Bitrix\Main\Data\Cache;

$elementId = 123;
$cache = Cache::createInstance();
$cacheTime = 3600;
$cacheId = 'opengraph_element_' . $elementId;
$cacheDir = '/dev2fun/opengraph/elements/';
$tags = ['opengraph_element_' . $elementId]; // Теги для сброса

// Пытаемся получить данные из кеша
if ($cache->initCache($cacheTime, $cacheId, $cacheDir)) {
    $ogData = $cache->getVars();
} elseif ($cache->startDataCache()) {
    // Генерация данных
    $ogData = [
        'title' => 'Заголовок элемента ' . $elementId,
        'image' => '/upload/elements/' . $elementId . '.jpg',
    ];

    // Устанавливаем теги для кеша
    $cache->tag($tags);
    $cache->endDataCache($ogData);
}

// Сброс кеша по тегу при изменении элемента
$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandler('iblock', 'OnAfterIBlockElementUpdate', function($elementId) {
    $cache = Cache::createInstance();
    $cache->clean('opengraph_element_' . $elementId, '/dev2fun/opengraph/elements/');
});
4. Комбинированный пример (кеш + теги)
use Bitrix\Main\Data\ManagedCache;

$managedCache = new ManagedCache();
$cacheKey = 'opengraph_rules';
$cacheTags = ['opengraph_global']; // Общий тег для всех правил

// Чтение кеша
if ($managedCache->read(3600, $cacheKey, $cacheTags)) {
    $rules = $managedCache->get($cacheKey);
} else {
    $rules = OpenGraphTable::getList([
        'filter' => ['ACTIVE' => 'Y'],
        'cache' => ['ttl' => 3600],
    ])->fetchAll();

    $managedCache->set($cacheKey, $rules, $cacheTags);
}

// Сброс всего кеша с тегом 'opengraph_global' при изменении настроек
\Bitrix\Main\Config\Option::set('dev2fun.opengraph', 'some_setting', 'new_value');
$managedCache->cleanByTag('opengraph_global');
Когда что использовать:
Тип кеша Сценарий применения
Файловый Кеширование HTML-блоков, статичных данных.
ManagedCache Частый доступ к данным в рамках одного запроса (в памяти).
Тегированный Связанные данные, которые нужно сбрасывать группами.


Важные нюансы:
1. Очистка кеша:
// Файловый кеш
(new CPHPCache())->CleanDir('/dev2fun/opengraph/');

// ManagedCache
(new ManagedCache())->cleanAll();

// По тегу
Cache::clearTag('opengraph_global');
2. TTL:
   - `0` — кеш хранится до явного сброса.
   - `3600` — обновляется каждые 2 часа.

3. Кеширование в компонентах:
   В параметрах компонента укажите:
'CACHE_TIME' => 3600,
'CACHE_GROUPS' => 'N', // Игнорировать группы пользователей
'CACHE_TYPE' => 'A', // Авторежим (учитывает TTL)

bitrixone © 2025