Модератор: phpBB2 - administrators
serega писал(а):Конечно, описание кешей только конфигами не всегда подходит. Например, есть случаи, когда для разных типов пользователей нужно создавать различные кеши. Но для простых случаев - описание конфигами, думаю, будет полезным.
pachanga писал(а):...и все же, я очень рекомендую переназвать, пока не поздно, классы в пакете, добавив префикс 2....
Это полезная практика, например, http://pear.php.net/package/MDB2, http://pear.php.net/package/XML_HTMLSax3 и т.д
pachanga писал(а):Э...это как?korchasa писал(а): Предлагаю нейтральный вариант - сделать его бранчем пакета cache.
korchasa писал(а):korchasa писал(а):... Насчет того, что использовать - пока не знаю. lmbMintCache медленнее, но надежнее. Возможно стоит его использовать. Просто я пока не знаю, как лучше описывать цепочки кэшей. Например, как сделать тэгируемый mint-кэш, без большого оверхеда по операциям, на основе конфига.
В общем пока думаю сделать как-то так:
- Код: Выделить всё
//cache.conf.php
$conf['default'] = 'memcache://localhost';
$conf['template'] = 'mint://?conn=default&default_ttl=300';
//запрос кэша
lmbToolkit::instance()->getCache('template')->get('news');
соответственно, если нам нужно выводить на экран информацию о запросах:
- Код: Выделить всё
//где-то вначале работы (фильтр в цепочке)
$this->getConf('cache')->set('template', 'logged://conn=template&logger=memory');
//где-то вконце, где надо вывести статистику по запросам (тоже фильтр в цепочке)
$this->getCache('template')->getStatistic();
conf писал(а):У меня вопрос: у нас есть несколько видов оберток над базовыми кэшами, например, lmbMintCache, lmbLoggedCache и lmbTaggableCache. Их можно как-нибудь использовать вместе? Как будет выглядеть конфиг в таком случае?
Например, конфиг минт-кэша с поддержкой тегов на memcache.
function getTemplateCache()
{
if(is_object($this->template_cache))
return $this->template_cache;
lmb_require('limb/cache2/src/lmbMintCache.class.php');
lmb_require('limb/cache2/src/lmbCache.class.php');
$conf = $this->toolkit->getConf('cache');
if($conf->get('cache_enabled'))
{
$cache_backend = lmbCache :: createConnection($conf->get('template_cache_dsn'));
$this->template_cache = new lmbLoggedCache(new lmbMintCache($cache_backend), 'template');
}
else
$this->template_cache = self :: createFakeCache('template');
return $this->template_cache;
}
class MemberCacheService
{
static $members;
...
static function findMember($member_id)
{
if(!$member_id)
return null;
if(isset(self :: $members[$member_id]))
return self :: $members[$member_id];
$cache = lmbToolkit :: instance()->getMembersCache();
$member = $cache->get('member_' . $member_id);
if(!$member && !is_object($member))
{
if(!$member = lmbActiveRecord :: findById('Member', $member_id, false))
return null;
self :: addMemberToCache($member);
}
return $member;
}
...
}
wIliaM писал(а):conf писал(а):У меня вопрос: у нас есть несколько видов оберток над базовыми кэшами, например, lmbMintCache, lmbLoggedCache и lmbTaggableCache. Их можно как-нибудь использовать вместе? Как будет выглядеть конфиг в таком случае?
Например, конфиг минт-кэша с поддержкой тегов на memcache.
мы решаем это следующим образом:
вводим в тулкит методы
- Код: Выделить всё
function getTemplateCache()
{
if(is_object($this->template_cache))
return $this->template_cache;
lmb_require('limb/cache2/src/lmbMintCache.class.php');
lmb_require('limb/cache2/src/lmbCache.class.php');
$conf = $this->toolkit->getConf('cache');
if($conf->get('cache_enabled'))
{
$cache_backend = lmbCache :: createConnection($conf->get('template_cache_dsn'));
$this->template_cache = new lmbLoggedCache(new lmbMintCache($cache_backend), 'template');
}
else
$this->template_cache = self :: createFakeCache('template');
return $this->template_cache;
}
более того добавляем прослойку сервисов(может быть даже это стоит называть DAO), которая является объектной оберткой над кэшем:
- Код: Выделить всё
class MemberCacheService
{
static $members;
...
static function findMember($member_id)
{
if(!$member_id)
return null;
if(isset(self :: $members[$member_id]))
return self :: $members[$member_id];
$cache = lmbToolkit :: instance()->getMembersCache();
$member = $cache->get('member_' . $member_id);
if(!$member && !is_object($member))
{
if(!$member = lmbActiveRecord :: findById('Member', $member_id, false))
return null;
self :: addMemberToCache($member);
}
return $member;
}
...
}
все это на верхнем уровне позволяет очень прозрачно работать с объектами, даже ничего не зная про кэш. но при этом ничего не мешает при необходимости вклиниться а любой уровень приложения
/**
* interface lmbNonTransparentCache.
*
* @package cache
* @version $Id$
*/
interface lmbNonTransparentCache
{
function add ($key, $value, $ttl = false);
function set ($key, $value, $ttl = false);
function get ($key);
function delete($key);
function flush();
}
/**
* interface lmbNonTransparentCache.
*
* @package cache
* @version $Id$
*/
interface lmbCacheConnection
{
function add ($key, $value, $ttl = false);
function set ($key, $value, $ttl = false);
function get ($key);
function delete($key);
function flush();
}
interface lmbCache
{
const OPERATION_ADD = 'ADD';
const OPERATION_SET = 'SET';
const OPERATION_GET = 'GET';
const OPERATION_DELETE = 'DELETE';
const OPERATION_LOCK = 'LOCK';
const OPERATION_UNLOCK = 'UNLOCK';
const OPERATION_INCREMENT = 'INCREMENT';
const OPERATION_DECREMENT = 'DECREMENT';
function set($key, $value);
function get($key);
function delete($key);
}
$cache->set($key, $value, $tag1, $ttl);
$cache->set($key, $value, $tag2, $ttl);
conf писал(а):А так все намного лучше, чем было в первом пакете, спасибо
...
function add ($key, $value, $params = array());
function set ($key, $value, $params = array());
...
CM-Z писал(а):conf писал(а):А так все намного лучше, чем было в первом пакете, спасибо
Жаль только отказались от интерфейса:
- Код: Выделить всё
...
function add ($key, $value, $params = array());
function set ($key, $value, $params = array());
...
У меня всё так здорово было завязано на $params = array(); Пришлось все мои тулкиты и хелперы капитально переделывать
function add($key, $value, $ttl = false, $params = array())
serega писал(а):Хм, а может в cache2 все-таки ввести параметр $params. Но ttl все равно оставить?
korchasa писал(а):serega писал(а):Хм, а может в cache2 все-таки ввести параметр $params. Но ttl все равно оставить?
Ты уже придумал применение?
korchasa писал(а):serega писал(а):Хм, а может в cache2 все-таки ввести параметр $params. Но ttl все равно оставить?
Ты уже придумал применение?
serega писал(а):korchasa писал(а):serega писал(а):Хм, а может в cache2 все-таки ввести параметр $params. Но ttl все равно оставить?
Ты уже придумал применение?
Пусть CM-Z дасть пример параметра, кроме ttl
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1