Skip to content

Repository files navigation

Битрикс Кеш

Travis Build StatuscodecovPHP versionLatest versionDownloadsLicense

Удобная обёртка для работы с кешем в Битрикс через fluent interface или по PSR-16. Защита от "cache stampede" ("давки в кеше") по PSR-6: Caching Interface

Возможности

Основное назначение этой библиотеки - максимальное ускорение написания кода, требующего использования кеширования. Дополнительное - защита от "давки в кеше"("cache stampede" или "dog piling") для высоконагруженных проектов методами "блокировки"("locking") и "вероятностного преждевременного устаревания"("probabilistic early expiration"), адаптированная из Symfony Cache 5.1.

Под "капотом" толькоBitrix\Main\Data\Cache и Bitrix\Main\Data\TaggedCache из ядра D7.

Установка

  1. Установить через composer:

    composer require webarchitect609/bitrix-cache
  2. Добавить подключение автозагрузчика composer в самое начало файла init.php

    require_once$_SERVER['DOCUMENT_ROOT'] . '/../../vendor/autoload.php';

Помочь проекту

Вы можете использовать эту библиотеку совершенно бесплатно, а можете поблагодарить автора за проделанную работу и поддержать желание делать новые полезные проекты:

Использование

  1. Для ленивых и торопливых:

    useWebArch\BitrixCache\Cache;
    $result = Cache::create()
    ->callback(
    function () {
    /** * Результат выполнения кода здесь * кешируется на 1 час. */returndate(DATE_ISO8601);
    }
    );
  2. Кеширование с использованием замыкания.

    useWebArch\BitrixCache\Cache;
    $result = Cache::create()
    ->setPath('/myPath')
    ->setKey('myKey')
    ->setTTL(60)
    ->callback(
    function () {
    /** * Результат выполнения этого * замыкания кешируется. */returndate(DATE_ISO8601);
    }
    );
  3. Сброс кеша по key.

    Для очистки кеша из предыдущего примера необохдимо вызвать метод delete(string $key), предварительно установив path и baseDir соответствующие ранее созданному кешу(по умолчанию baseDir === 'cache').

    useWebArch\BitrixCache\Cache;
    Cache::create()
    ->setPath('/myPath')
    ->delete('myKey');
  4. Запись тегированного кеша.

    Кеш по пути /myPath будет снабжён двумя тегами: myTag и тегом инфоблока iblock_id_1.

    useWebArch\BitrixCache\Cache;
    $result = Cache::create()
    ->setPath('/myPath')
    ->addTag('myTag')
    ->addIblockTag(1)
    ->callback(
    function () {
    returndate(DATE_ISO8601);
    }
    );

    Тег кеша также можно установить внутри замыкания:

    useWebArch\BitrixCache\Cache;
    $cache = Cache::create();
    $result = $cache->callback(
    function () use($cache) {
    $cache->addTag('closureTag');
    returndate(DATE_ISO8601);
    }
    );
  5. Удаление тегированного кеша.

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

    useWebArch\BitrixCache\Cache;
    Cache::create()
    ->clearByTag('myTag'); 
  6. Использование всех возможностей fluent-интерфейса.

    В результате запись ведётся не в папку cache, а в папку myBaseDir по пути /myPath с ключом myKey на 60 секунд и только с тегом TheOnlyTag, т.к. все предыдущие теги были сброшены вызовом clearTags()

    useWebArch\BitrixCache\Cache;
    $result = Cache::create()
    ->setBaseDir('myBaseDir')
    ->setPath('/myPath')
    ->setKey('myKey')
    ->setTTL(60)
    ->addIblockTag(2)
    ->addTag('myTagOne')
    ->addTag('myTagTwo')
    ->clearTags()
    ->addTag('TheOnlyTag')
    ->callback(
    function () {
    returndate(DATE_ISO8601);
    }
    );
  7. Отмена записи кеша в момент исполнения замыкания.

    Метод abort() используется для предотвращения записи кеша вне зависимости от того, что вернёт замыкание.

    useWebArch\BitrixCache\Cache;
    $cache = Cache::create();
    $result = $cache->callback(
    function () use ($cache) {
    /** * Например, API вернул ответ, что товар не найден. */$productNotFound = true;
    if($productNotFound){
    $cache->abort();
    }
    returndate(DATE_ISO8601);
    }
    );
  8. Задание TTL в виде интервала DateInterval.

    В результате значение будет закешировано на 1 месяц и 15 минут.

    useWebArch\BitrixCache\Cache;
    $result = Cache::create()
    ->setTTLInterval(newDateInterval('P1MT15M'))
    ->callback(
    function () {
    returndate(DATE_ISO8601);
    }
    );
  9. Задание TTL к заданному времени.

    В результате значение будет закешировано до 31 декабря 2020. Но если указанная дата и время уже прошли, будет ошибка. Метод полезен, чтобы, например, задавать время жизни кеша по дате окончания активности.

    useWebArch\BitrixCache\Cache;
    Cache::create()
    ->setExpirationTime(newDateTimeImmutable('2020-12-30T23:59:59', newDateTimeZone('+03:00')))
    ->set('myKey', 'someValue');
  10. Использование PSR-16.

    Все методы по PSR-16 работают только внутри указанных baseDir и path. Т.е. вызов clear()не очистит полностью весь кеш Битрикс.

    useWebArch\BitrixCache\Cache;
    $cache = Cache::create()
    ->setBaseDir('myBaseDir')
    ->setPath('/myPath');
    $cache->set('myKey', 'myValue', 86400);
    $result = $cache->get('myKey', 'defaultValue');
    $cache->delete('myKey');
    $cache->clear();
    $cache->setMultiple(
    [
    'key1' => 'value1',
    'key2' => 'value2',
    ]
    );
    $multipleResult = $cache->getMultiple(['key1', 'key2', 'key3'], 'defaultValueForMissingMultiple');
    $cache->deleteMultiple(['key1', 'key2', 'key3', 'key4']);
    /*** Внимание! Этот метод можно использовать только для прогрева кеша. См. примечание к методу.*/$cache->has('key2');
  11. Защита от "давки в кеше"

    Отдельно должен быть собран адаптер, обслуживающий кеш с защитой от "давки".

    use \WebArch\BitrixCache\AntiStampedeCacheAdapter;
    $path = '/some/path';
    $defaultLifetime = 60;
    $baseDir = 'someBaseDir';
    $cacheAdapter = newAntiStampedeCacheAdapter($path, $defaultLifetime, $baseDir);

    Затем следует использовать этот адаптер в тех местах кода, где такая защита требуется.

    use \WebArch\BitrixCache\AntiStampedeCacheAdapter;
    use \WebArch\BitrixCache\CacheItem;
    /** @var AntiStampedeCacheAdapter $cacheAdapter */$cacheAdapter->get(
    'myKey',
    function (CacheItem$cacheItem) {
    $cacheItem->expiresAfter(3600);
    returndate(DATE_ISO8601);
    }
    );

    Дополнительная информация описана в документации компонента Symfony Cache и соглашения Cache Contracts.

Известные особенности

Очистка кеша

Метод \WebArch\BitrixCache\Cache::clear() очищает кеш только внутри $baseDir и подкаталога $path. Эти параметры относятся только к Битрикс и никак не описаны в PSR-16.

Лицензия и информация об авторах

BSD-3-Clause

About

Удобная обёртка с fluent-интерфейсом для работы с кешем в Битрикс.

Topics

Resources

Stars

27 stars

Watchers

4 watching

Forks

Releases

Sponsor this project

Used by

Contributors

Languages