{"id":15046076,"url":"https://github.com/webarchitect609/bitrix-cache","last_synced_at":"2026-03-08T18:30:55.816Z","repository":{"id":45308772,"uuid":"90544414","full_name":"webarchitect609/bitrix-cache","owner":"webarchitect609","description":"Удобная обёртка с fluent-интерфейсом для работы с кешем в Битрикс.","archived":false,"fork":false,"pushed_at":"2024-06-04T17:26:32.000Z","size":157,"stargazers_count":25,"open_issues_count":5,"forks_count":15,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-01-31T10:25:48.723Z","etag":null,"topics":["bitrix","cache","composer","composer-library","fluent-interface","php","psr-16"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/webarchitect609.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"custom":["https://sobe.ru/na/bitrix_cache"]}},"created_at":"2017-05-07T15:59:19.000Z","updated_at":"2025-01-21T20:59:29.000Z","dependencies_parsed_at":"2024-06-18T18:38:32.153Z","dependency_job_id":null,"html_url":"https://github.com/webarchitect609/bitrix-cache","commit_stats":{"total_commits":39,"total_committers":3,"mean_commits":13.0,"dds":"0.15384615384615385","last_synced_commit":"d882b1f0b260c57c662b747640dd2efd2007f052"},"previous_names":[],"tags_count":32,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webarchitect609%2Fbitrix-cache","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webarchitect609%2Fbitrix-cache/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webarchitect609%2Fbitrix-cache/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webarchitect609%2Fbitrix-cache/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/webarchitect609","download_url":"https://codeload.github.com/webarchitect609/bitrix-cache/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":238207646,"owners_count":19434095,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bitrix","cache","composer","composer-library","fluent-interface","php","psr-16"],"created_at":"2024-09-24T20:52:40.560Z","updated_at":"2025-10-25T20:31:41.965Z","avatar_url":"https://github.com/webarchitect609.png","language":"PHP","readme":"Битрикс Кеш\n===========\n[![Travis Build Status](https://travis-ci.com/webarchitect609/bitrix-cache.svg?branch=master)](https://travis-ci.com/webarchitect609/bitrix-cache)\n[![codecov](https://codecov.io/gh/webarchitect609/bitrix-cache/branch/master/graph/badge.svg?token=GPA31FOIGA)](https://codecov.io/gh/webarchitect609/bitrix-cache)\n[![PHP version](https://img.shields.io/packagist/php-v/webarchitect609/bitrix-cache)](https://www.php.net/supported-versions.php)\n[![Latest version](https://img.shields.io/github/v/tag/webarchitect609/bitrix-cache?sort=semver)](https://github.com/webarchitect609/bitrix-cache/releases)\n[![Downloads](https://img.shields.io/packagist/dt/webarchitect609/bitrix-cache)](https://packagist.org/packages/webarchitect609/bitrix-cache)\n[![License](https://img.shields.io/github/license/webarchitect609/bitrix-cache)](LICENSE.md)\n\nУдобная обёртка для работы с кешем в Битрикс через fluent interface или по\n[PSR-16](https://www.php-fig.org/psr/psr-16/). Защита от\n[\"cache stampede\"](https://en.wikipedia.org/wiki/Cache_stampede) (\"давки в кеше\") по\n[PSR-6: Caching Interface](https://www.php-fig.org/psr/psr-6/)\n\nВозможности\n-----------\nОсновное назначение этой библиотеки - **максимальное ускорение** написания кода, требующего использования кеширования.\nДополнительное - **защита от \"давки в кеше\"**(\"cache stampede\" или \"dog piling\") для высоконагруженных проектов\nметодами \"блокировки\"(\"locking\") и \"вероятностного преждевременного устаревания\"(\"probabilistic early expiration\"),\nадаптированная из [Symfony Cache 5.1](https://packagist.org/packages/symfony/cache).\n\n- запись, чтение, валидация и удаление закешированной информации через fluent interface с поддержкой всех\n    Битрикс-специфичных параметров:\n    - baseDir\n    - path\n    - [тегированный кеш](https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=43\u0026LESSON_ID=2978\u0026LESSON_PATH=3913.4565.4780.2978)\n    (в том числе теги [инфоблоков](https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=43\u0026CHAPTER_ID=04610\u0026LESSON_PATH=3913.4610))\n- кеширование результата выполнения [замыкания](https://www.php.net/manual/ru/functions.anonymous.php)\n- поддержка интерфейса `Psr\\SimpleCache\\CacheInterface` по\n    [PSR-16: Common Interface for Caching Libraries](https://www.php-fig.org/psr/psr-16/) \n- адаптер `AntiStampedeCacheAdapter` с двойной защитой от \"давки в кеше\", соответствующий\n    [PSR-6: Caching Interface](https://www.php-fig.org/psr/psr-6/) и\n    [Symfony Cache Contracts](https://github.com/symfony/cache-contracts)\n\nПод \"капотом\" **только** `Bitrix\\Main\\Data\\Cache` и `Bitrix\\Main\\Data\\TaggedCache` из\n[ядра D7](https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=43\u0026CHAPTER_ID=05062\u0026LESSON_PATH=3913.5062).\n\nУстановка\n---------\n1. Установить через [composer](https://getcomposer.org/):\n\n    ```bash\n    composer require webarchitect609/bitrix-cache\n    ```\n2. Добавить подключение [автозагрузчика](https://getcomposer.org/doc/01-basic-usage.md#autoloading) composer в самое\nначало [файла init.php](https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=43\u0026LESSON_ID=2916\u0026LESSON_PATH=3913.4776.2916)\n    \n    ```php\n    require_once $_SERVER['DOCUMENT_ROOT'] . '/../../vendor/autoload.php';\n    ```\n\nПомочь проекту\n--------------\nВы можете использовать эту библиотеку совершенно бесплатно, а можете поблагодарить автора за проделанную работу и\nподдержать желание делать новые полезные проекты:  \n- [ЮMoney](https://sobe.ru/na/bitrix_cache)\n\nИспользование\n-------------\n1. Для ленивых и торопливых:\n\n    ```php\n    use WebArch\\BitrixCache\\Cache;\n    \n    $result = Cache::create()\n                   -\u003ecallback(\n                       function () {\n                           /**\n                            * Результат выполнения кода здесь\n                            * кешируется на 1 час.\n                            */\n                           return date(DATE_ISO8601);\n                       }\n                   );\n    ```\n\n2. Кеширование с использованием [замыкания](https://www.php.net/manual/ru/functions.anonymous.php).\n\n    ```php\n    use WebArch\\BitrixCache\\Cache;\n    \n    $result = Cache::create()\n                   -\u003esetPath('/myPath')\n                   -\u003esetKey('myKey')\n                   -\u003esetTTL(60)\n                   -\u003ecallback(\n                       function () {\n                           /**\n                            * Результат выполнения этого\n                            * замыкания кешируется.\n                            */\n                           return date(DATE_ISO8601);\n                       }\n                   );\n    ```\n\n3. Сброс кеша по key.\n    \n    Для очистки кеша из предыдущего примера необохдимо вызвать метод `delete(string $key)`, предварительно установив\n    `path` и `baseDir` соответствующие ранее созданному кешу(по умолчанию `baseDir === 'cache'`).\n\n    ```php\n    use WebArch\\BitrixCache\\Cache;\n    \n    Cache::create()\n         -\u003esetPath('/myPath')\n         -\u003edelete('myKey');\n    ```\n4. Запись тегированного кеша.\n    \n    Кеш по пути `/myPath` будет снабжён двумя тегами: `myTag` и тегом инфоблока `iblock_id_1`.\n\n    ```php\n    use WebArch\\BitrixCache\\Cache;\n    \n    $result = Cache::create()\n                   -\u003esetPath('/myPath')\n                   -\u003eaddTag('myTag')\n                   -\u003eaddIblockTag(1)\n                   -\u003ecallback(\n                       function () {\n                           return date(DATE_ISO8601);\n                       }\n                   );\n    ```\n\n    Тег кеша также можно установить внутри замыкания:\n\n    ```php\n    use WebArch\\BitrixCache\\Cache;\n    \n    $cache = Cache::create();\n    $result = $cache-\u003ecallback(\n                        function () use($cache) {\n                            $cache-\u003eaddTag('closureTag');\n\n                            return date(DATE_ISO8601);\n                        }\n                    );\n    ```\n\n5. Удаление тегированного кеша.\n    \n    Кеш из предыдущего примера может быть очищен по тегу. Важно, что при очистке по тегу не требуется устанавливать\n    никакие другие параметры.\n   \n    ```php\n    use WebArch\\BitrixCache\\Cache;\n    \n    Cache::create()\n         -\u003eclearByTag('myTag'); \n    ```\n   \n6. Использование всех возможностей fluent-интерфейса.\n\n    В результате запись ведётся не в папку `cache`, а в папку `myBaseDir` по пути `/myPath` с ключом `myKey` на 60\n    секунд и только с тегом `TheOnlyTag`, т.к. все предыдущие теги были сброшены вызовом `clearTags()`\n\n    ```php\n    use WebArch\\BitrixCache\\Cache;\n    \n    $result = Cache::create()\n                   -\u003esetBaseDir('myBaseDir')\n                   -\u003esetPath('/myPath')\n                   -\u003esetKey('myKey')\n                   -\u003esetTTL(60)\n                   -\u003eaddIblockTag(2)\n                   -\u003eaddTag('myTagOne')\n                   -\u003eaddTag('myTagTwo')\n                   -\u003eclearTags()\n                   -\u003eaddTag('TheOnlyTag')\n                   -\u003ecallback(\n                       function () {\n                           return date(DATE_ISO8601);\n                       }\n                   );\n    ```\n\n7. Отмена записи кеша в момент исполнения замыкания.\n    \n    Метод `abort()` используется для предотвращения записи кеша вне зависимости от того, что вернёт замыкание.\n    \n    ```php\n    use WebArch\\BitrixCache\\Cache;\n        \n    $cache = Cache::create();\n    $result = $cache-\u003ecallback(\n                        function () use ($cache) {\n                            /**\n                             * Например, API вернул ответ, что товар не найден.\n                             */\n                            $productNotFound = true;\n                            if($productNotFound){\n                                $cache-\u003eabort();\n                            }\n\n                            return date(DATE_ISO8601);\n                        }\n                    );\n    ```\n\n8. Задание TTL в виде интервала `DateInterval`.\n    \n    В результате значение будет закешировано на 1 месяц и 15 минут.\n    \n    ```php\n    use WebArch\\BitrixCache\\Cache;\n   \n    $result = Cache::create()\n                   -\u003esetTTLInterval(new DateInterval('P1MT15M'))\n                   -\u003ecallback(\n                       function () {\n                           return date(DATE_ISO8601);\n                       }\n                   );\n    ```\n\n9. Задание TTL к заданному времени.\n    \n    В результате значение будет закешировано до 31 декабря 2020. Но если указанная дата и время уже прошли, будет\n    ошибка. Метод полезен, чтобы, например, задавать время жизни кеша по дате окончания активности. \n    \n    ```php\n    use WebArch\\BitrixCache\\Cache;\n    \n    Cache::create()\n         -\u003esetExpirationTime(new DateTimeImmutable('2020-12-30T23:59:59', new DateTimeZone('+03:00')))\n         -\u003eset('myKey', 'someValue');\n    ```\n\n10. Использование [PSR-16](https://www.php-fig.org/psr/psr-16/).\n\n    Все методы по PSR-16 работают **только** внутри указанных `baseDir` и `path`. Т.е. вызов `clear()` **не очистит**\n    полностью весь кеш Битрикс.\n\n    ```php\n    use WebArch\\BitrixCache\\Cache;\n    \n    $cache = Cache::create()\n                 -\u003esetBaseDir('myBaseDir')\n                 -\u003esetPath('/myPath');\n    \n    $cache-\u003eset('myKey', 'myValue', 86400);\n    $result = $cache-\u003eget('myKey', 'defaultValue');\n    $cache-\u003edelete('myKey');\n    $cache-\u003eclear();\n    $cache-\u003esetMultiple(\n       [\n           'key1' =\u003e 'value1',\n           'key2' =\u003e 'value2',\n       ]\n    );\n    $multipleResult = $cache-\u003egetMultiple(['key1', 'key2', 'key3'], 'defaultValueForMissingMultiple');\n    $cache-\u003edeleteMultiple(['key1', 'key2', 'key3', 'key4']);\n    /**\n    * Внимание! Этот метод можно использовать только для прогрева кеша. См. примечание к методу.\n    */\n    $cache-\u003ehas('key2');\n    ```\n11. Защита от \"давки в кеше\"\n\n    Отдельно должен быть собран адаптер, обслуживающий кеш с защитой от \"давки\".\n    \n    ```php\n    use \\WebArch\\BitrixCache\\AntiStampedeCacheAdapter;\n    \n    $path = '/some/path';\n    $defaultLifetime = 60;\n    $baseDir = 'someBaseDir';\n    $cacheAdapter = new AntiStampedeCacheAdapter($path, $defaultLifetime, $baseDir);\n    ```\n    \n    Затем следует использовать этот адаптер в тех местах кода, где такая защита требуется.\n    \n    ```php\n    use \\WebArch\\BitrixCache\\AntiStampedeCacheAdapter;\n    use \\WebArch\\BitrixCache\\CacheItem;\n    \n    /** @var AntiStampedeCacheAdapter $cacheAdapter */\n    $cacheAdapter-\u003eget(\n        'myKey',\n        function (CacheItem $cacheItem) {\n            $cacheItem-\u003eexpiresAfter(3600);\n            \n            return date(DATE_ISO8601);\n        }\n    );\n    ```\n    \n    Дополнительная информация описана в документации компонента\n    [Symfony Cache](https://symfony.com/doc/5.1/components/cache.html#cache-component-contracts) и соглашения\n    [Cache Contracts](https://symfony.com/doc/5.1/components/cache.html#cache-component-contracts).\n\n\nИзвестные особенности\n---------------------\n\n### Очистка кеша\n\nМетод `\\WebArch\\BitrixCache\\Cache::clear()` очищает кеш **только** внутри `$baseDir` и подкаталога `$path`. Эти\nпараметры относятся только к Битрикс и никак не описаны в [PSR-16](https://www.php-fig.org/psr/psr-16/).\n\nЛицензия и информация об авторах\n--------------------------------\n\n[BSD-3-Clause](LICENSE.md)\n","funding_links":["https://sobe.ru/na/bitrix_cache"],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwebarchitect609%2Fbitrix-cache","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwebarchitect609%2Fbitrix-cache","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwebarchitect609%2Fbitrix-cache/lists"}