Причина - мы больше не используем Битрикс в своих проектах. Если вам интересен этот проект и вы хотите заняться его поддержкой - форкните его и создайте Issue в данном репозитории чтобы мы поместили здесь ссылку на форк.
composer require arrilot/bitrix-cacher
- Регистрируем пакет в
init.php
-Arrilot\BitrixCacher\ServiceProvider::register();
use Arrilot\BitrixCacher\Cache;
use Arrilot\BitrixCacher\AbortCacheException;
$result = Cache::remember('cacheKeyHere', 3600, function () {
$result = 0;
for ($i = 0; $i < 20000000; $i++) {
$result += $i;
}
if ( // something bad happened ) {
// выполнит $obCache->AbortDataCache() и вернёт null в качестве $result
throw new AbortCacheException();
}
return $result;
});
Для удобства рекомендуется добавить глобальный хэлпер:
/**
* @param null|string $key
* @param null|int $seconds
* @param null|Closure $callback
* @param string $initDir
* @param string $basedir
* @return \Arrilot\BitrixCacher\CacheBuilder|mixed
*/
function cache($key = null, $seconds = null, $callback = null, $initDir = '/', $basedir = 'cache')
{
if (func_num_args() === 0) {
return new \Arrilot\BitrixCacher\CacheBuilder();
}
return \Arrilot\BitrixCacher\Cache::remember($key, $seconds, $callback, $initDir, $basedir);
}
и использовать его либо вместо Cache::remember()
, либо как начало цепочки построения кэша CacheBuilder-а
Обратите внимание, что в отличии от CPHPCache::InitCache()
(и его аналога из d7) по-умолчанию $initDir = '/'
, а не false.
Это значит, что по-умолчанию кэш доступен для всего сайта.
$result = cache()
->key('cacheKeyHere')
->seconds(3600) // также доступны методы minutes(), hours(), days()
->initDir('/foo') // можно опустить если хотим использовать значение по-умолчанию
->baseDir('cache/foo') // можно опустить если хотим использовать значение по-умолчанию
->execute(function () {
...
return ...;
});
В случаях, когда возможен многократный вызов одного и того же кэша (т.е. с одними и теми же параметрами key, initDir, baseDir) в течение выполнения одного скрипта,
разумно добавлять дополнительное кэширование в php переменную, чтобы не дергать внешнее хранилище с кэшем (файлы, memcache и т д) просто так несколько раз.
С использованием CacheBuilder это сделать очень просто - надо добавить ->enablePhpLayer()
в цепочку построения кэша.
$result = cache()
->key('cacheKeyHere')
->seconds(3600)
->enablePhpLayer()
->execute(function () {
...
return ...;
});
Если есть потребность кэшировать вообще только в php-переменную (не трогая внешнее хранилище), то это делается вот так:
$result = cache()
->key('cacheKeyHere')
->onlyPhpLayer()
->execute(function () {
...
return ...;
});
Время кэширования в этом случае уже, конечно, не имеет смысла.
Если вы хотите отменить создание кэша в execute, то необходимо выкинуть исключение Arrilot\BitrixCacher\AbortCacheException
Цепочка execute при этом вернёт null, это значение можно изменить при помощи ->whenAbort([])->
или ->whenAbort(function () { return 'some message'; })->
Пакет предоставляет дополнительное окно отладки в котором можно посмотреть
- сколько и каких мы сделали запросов в кэш,
- сколько хитов,
- сколько мисов,
- сколько запросов с нулевым TTL и которые не кэшируются, соответственно, вообще