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

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

;Устанавливает режим работы: files, memcached, redis, fake
UBCACHE_STORAGE=files
;Необязательные опции, устанавливающие если требуется альтернативные параметры memcached
;(без них дефолт - localhost:11211)
MEMCACHED_SERVER=localhost
MEMCACHED_PORT=11211

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

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

Пока что так /etc/rc.conf

redis_enable="YES"
# 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
ubillingcache.txt · Последние изменения: 2017/09/16 12:32 — 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