Подсистема кэширования

Присутствует в составе, начиная с Ubilling 0.6.8. Все брутально и прямолинейно как всегда. Реализовано в виде класса UbillingCache и управляется следующими опциями alter.ini:

; Устанавливает тип хранилища системного кэша, возможные значения:
; files - в файлах, используется по-умолчанию, не требует конфигурации
; memcached - использует Memcached для кэширования данных в оперативной памяти на основе хеш-таблиц
; redis - использует Redis как сетевое журналируемое хранилище данных типа "ключ — значение"
; fake - фэйковый кэш - считается, что он всегда пуст
UBCACHE_STORAGE=files
; Необязательные опции, устанавливающие если требуется альтернативные параметры memcached и redis
;MEMCACHED_SERVER=localhost
;MEMCACHED_PORT=11211
;REDIS_SERVER=localhost
;REDIS_PORT=6379

Пример использования

Вся работа с классом намотана вокруг метода getCallback:

$cache = new UbillingCache(); // Создаем объект
$cacheTime=60; // в секундах
$someData = $cache->getCallback('EXAMPLE_KEY', function () {
    return (web_AnalyticsPaymentsMonthGraph('2015'));
}, $cacheTime);
 
//показываем результат
show_window(__('Example data from cache'), $someData);

Стоит заметить, что вы можете не париться о сериализации своих данных при засовывании в кэш. На выходе вы получите тот же тип данных, который предполагался изначально. А что по скорости? А как-то так: Бенчмарки и всякое такое

ООП или использование в своем классе

Для протаскивания свойств вашего объекта внутрь анонимной функции коллбека вам придется использовать небольшой хак.

     public function sampleFunction() {
        $result = '';
        $this->initCache(); // тут мы инициализируем общий для объекта экземпляр кэша
                            // а именно создаем $this->cache и $this->timeout
        $obj = $this; // а вот собственно и хак
        $result = $this->cache->getCallback('SAMPLE_FUNCT_CACHE', function() use ($obj) {
            return ($obj->getLargeData()); // к сожалению getLargeData может быть только публичным методом
        }, $this->timeout);
        return ($result);
    }

Очистка

Хотя данные из кэша самостоятельно удаляются по прошествии времени $expiration указываемого в секундах, возможно вам потребуется очистить данные кэша «вот прямо сейчас». Для принудительной очистки конкретного ключа кэша, мы можем использовать публичный метод delete как-то так:

$cache->delete('EXAMPLE_KEY');

А если без наркомании?

Начиная с релиза 0.8.5 вы можете использовать это все просто на уровне set/get указывая время хранения в кэше. Да, в этом случае нам придется самим решать когда и как засовывать данные в кэш, в случае его устаревания.

Как-то так:

$cache=new UbillingCache();
$cacheTime=60;
$dataToPush='sample data';
 
 
//пытаемся получить данные из кэша
$dataInCache=$cache->get('CACHE_TEST_KEY', $cacheTime);
if (!empty($dataInCache)) {
    //если чего-то получено - показываем это в окошке
    show_window(__('Data from cache'),$dataInCache);
} else {
    //запихиваем данные в кэш на сколько нам нужно времени
    $cache->set('CACHE_TEST_KEY', $dataToPush, $cacheTime);
    show_warning(__('No data in received, cache expired'));
}

Memcached

Вополне понятно, что для UBCACHE_STORAGE=memcached требуется включенный и работающий сам memcached.

/etc/rc.conf

memcached_enable="YES"
memcached_flags="-l 127.0.0.1 -m 128 -I 10M"
 # /usr/local/etc/rc.d/memcached restart

Redis

Если в вашу сборку пакетов устанавливаемых UBinstaller (в новых бинарниках уже должен быть) не входит Redis, вы можете доустановить его вручную.

Как проверить есть ли он? Да просто методом pkg info | grep redis. Если нету - устанавливаем, если есть - переходим к включению и запуску.

# cd /usr/ports/databases/redis
# make && make install 
# cd /usr/ports/databases/pecl-redis
# make && make install 
# apachectl restart
# /usr/local/etc/rc.d/redis start

Включаем в /etc/rc.conf

redis_enable="YES"

с последующим запуском

# service redis restart
ubillingcache.txt · Последние изменения: 2018/08/03 01:54 — nightfly
 
За исключением случаев, когда указано иное, содержимое этой вики предоставляется на условиях следующей лицензии: CC Attribution-Share Alike 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki