Инструменты пользователя

Инструменты сайта


Боковая панель

Разделы

Общее описание
История изменений
Рекомендации к обновлению
Планы на будущее
Известные проблемы
Онлайн демо
Видео
Помощь проекту
Люди

FAQ


ubillingcache

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

Представляет из себя штатный уровень абстракции для задач требующих кэширования данных на определенное время. Присутствует в составе, начиная с 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
;Включает запись логирования работы кэша в exports/cache.log. Оно убивает быстродействие и используется только для отладки.
;UBCACHE_DEBUG=1

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

Вся работа с классом намотана вокруг метода 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'));
}

Следует также помнить, что в при прямой работе с помощью set/get рекомендуется указывать таймаут кэширования в обоих функциях. Так как для стораджей типа memcached или redis на таймаут хранения данных, влияет непосредственно set и реализован средствами самого хранилища а для хранилища files по вполне понятным причинам, актуальность содержащихся данных проверяется во время осуществления get (файлы на ФС не умеют сами по-по себе удаляться, удивительно, да?)

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/12/11 13:47 — nightfly