webarchitect609/bitrix-cache

Bitrix缓存舒适流畅的接口。反冲缓存保护。

v1.11.2 2023-02-26 12:40 UTC

README

Travis Build Status codecov PHP version Latest version Downloads License

通过流畅接口或按照 PSR-16 使用 Bitrix 缓存。提供针对 "缓存冲撞" 的保护,通过 PSR-6: Caching Interface

功能

该库的主要目的是最大程度地加快需要使用缓存的代码的编写。此外,它还提供针对高负载项目的方法,以“锁定”和“概率提前过期”来防止“缓存冲撞”(“cache stampede”或“dog piling”),这些方法是从 Symfony Cache 5.1 中改编的。

底层仅使用 D7 内核Bitrix\Main\Data\CacheBitrix\Main\Data\TaggedCache

安装

  1. 通过 composer 安装

    composer require webarchitect609/bitrix-cache
  2. init.php 文件的开始处添加 composer 自动加载器的连接

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

帮助项目

您可以免费使用这个库,也可以感谢作者的工作并支持他们做更多有用的项目

使用

  1. 对于懒惰和忙碌的开发者

    use WebArch\BitrixCache\Cache;
    
    $result = Cache::create()
                   ->callback(
                       function () {
                           /**
                            * Результат выполнения кода здесь
                            * кешируется на 1 час.
                            */
                           return date(DATE_ISO8601);
                       }
                   );
  2. 使用 闭包 进行缓存。

    use WebArch\BitrixCache\Cache;
    
    $result = Cache::create()
                   ->setPath('/myPath')
                   ->setKey('myKey')
                   ->setTTL(60)
                   ->callback(
                       function () {
                           /**
                            * Результат выполнения этого
                            * замыкания кешируется.
                            */
                           return date(DATE_ISO8601);
                       }
                   );
  3. 按 key 刷新缓存。

    在清理上一个示例中的缓存之前,需要调用方法 delete(string $key),并预先设置 pathbaseDir,使其与先前创建的缓存匹配(默认 baseDir === 'cache')。

    use WebArch\BitrixCache\Cache;
    
    Cache::create()
         ->setPath('/myPath')
         ->delete('myKey');
  4. 记录带标签的缓存。

    位于 /myPath 的缓存将附带两个标签:myTag 和信息块标签 iblock_id_1

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

    您也可以在闭包内设置缓存标签

    use WebArch\BitrixCache\Cache;
    
    $cache = Cache::create();
    $result = $cache->callback(
                        function () use($cache) {
                            $cache->addTag('closureTag');
    
                            return date(DATE_ISO8601);
                        }
                    );
  5. 删除带标签的缓存。

    可以使用标签清理上一个示例中的缓存。重要的是,清理标签时不需要设置其他任何参数。

    use WebArch\BitrixCache\Cache;
    
    Cache::create()
         ->clearByTag('myTag'); 
  6. 使用所有流畅接口功能。

    结果记录不是在cache文件夹中,而是在myBaseDir文件夹中,路径为/myPath,使用myKey作为键,持续60秒,并且只使用TheOnlyTag标签,因为所有之前的标签都被clearTags()调用清除了。

    use WebArch\BitrixCache\Cache;
    
    $result = Cache::create()
                   ->setBaseDir('myBaseDir')
                   ->setPath('/myPath')
                   ->setKey('myKey')
                   ->setTTL(60)
                   ->addIblockTag(2)
                   ->addTag('myTagOne')
                   ->addTag('myTagTwo')
                   ->clearTags()
                   ->addTag('TheOnlyTag')
                   ->callback(
                       function () {
                           return date(DATE_ISO8601);
                       }
                   );
  7. 在执行闭包时取消缓存记录。

    使用abort()方法来防止无论闭包返回什么都进行缓存记录。

    use WebArch\BitrixCache\Cache;
        
    $cache = Cache::create();
    $result = $cache->callback(
                        function () use ($cache) {
                            /**
                             * Например, API вернул ответ, что товар не найден.
                             */
                            $productNotFound = true;
                            if($productNotFound){
                                $cache->abort();
                            }
    
                            return date(DATE_ISO8601);
                        }
                    );
  8. 将TTL设置为DateInterval类型。

    结果将缓存1个月零15分钟。

    use WebArch\BitrixCache\Cache;
    
    $result = Cache::create()
                   ->setTTLInterval(new DateInterval('P1MT15M'))
                   ->callback(
                       function () {
                           return date(DATE_ISO8601);
                       }
                   );
  9. 将TTL设置为指定的时间。

    结果将缓存到2020年12月31日。但如果指定的时间已经过去,将会出现错误。此方法适用于设置缓存的生命周期为活动结束日期,例如。

    use WebArch\BitrixCache\Cache;
    
    Cache::create()
         ->setExpirationTime(new DateTimeImmutable('2020-12-30T23:59:59', new DateTimeZone('+03:00')))
         ->set('myKey', 'someValue');
  10. 使用PSR-16

    所有PSR-16方法仅在指定的baseDirpath内部工作。也就是说,调用clear()不会完全清除Bitrix的整个缓存。

    use WebArch\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 = new AntiStampedeCacheAdapter($path, $defaultLifetime, $baseDir);

    然后在这些需要保护的地方使用这个适配器。

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

    有关组件Symfony Cache和缓存约定Cache Contracts的更多信息,请参阅文档。

已知特性

清除缓存

\WebArch\BitrixCache\Cache::clear()方法只清除$baseDir$path子目录内的缓存。这些参数仅适用于Bitrix,并未在PSR-16中描述。

许可证和作者信息

BSD-3-Clause