суббота, 30 октября 2010 г.

php Cacher

Опубликовал набор классов для кеширования:
http://github.com/valmat/Cacher
Опубликовано под лицензией
GPL v.3 http://www.gnu.org/licenses/gpl.txt
Т.е. свободно для использования и изменения. Разумеется, приветствуются любые исправления и дополнения.

Назначение


Мне нужен был очень простой, но в то же время мощный кеширующий модуль с понятной логикой. При этом он должен быть пригодным для работы на односерверном, но в тоже время нагруженном проекте.
Так же немаловажным моментом является возможность прозрачно менять стратегию кеширования в зависимости от текущего уровня нагрузки проекта.
Т.е.решение должно удовлетворять требованию изменять стратегию кеширования по мере роста нагрузки на проект и по мере изменения аппаратных возможностей (речь об ОЗУ) сервера.

Архитектура


Основными логическими единицами являются:
  • Cacher - фронтен к кеширующим классам.
  • Cacher_Backend - собственно сами кеширующие классы.
  • Слоты - кеширование и доступ к кешу осуществляется через слоты.
  • Теги - для упрощения управления кешем, и, главным образом, для переуеширования.
  • Типы кеширования - для прозрачного изменения стратегии кеширования. Т.е. конкретный кеширующий бекенд подключается только через слот (или тег), которые в свою очередь оперируют типами. Таким образом для изменения тратегии кеширования нужно всего лишь поменять привязку типов к бекендам.


Использование


class Cacher


Требует наличия классов унаследованных от Cacher_Backend - семейство классов, реализующих бэкэнд для класса Cacher
Все операции с кешем осуществляется на низшем уровне через тот или иной бекенд
Бэкэндом может быть файловая система, shared memory, memcache, Sqlite и другие системы кеширования
Для работы с классом представляются слоты и теги. Слоты реализованы в виде набора дружественных функций и неявно зашиты в интерфейс текущего класса

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

define AnyObj // может быть класс, массив или дрогой объект. На основании эого объекта слот функция вычислит ключь и, возможно другиие параметры (бэкэнд и время жизни).
Cacher::Slot('AniObj',AniObj); // Инициализируем слот кеширования. Первый параметр для определения имени слота, второй - наш объект

Получаем данные
if (false === ($CacheData = Cacher::get())) { // Если данные из кеша получить не удалось...
$CacheData = GetFromAnyExternal(); // Получаем данные из внешнего хранилища
Cacher::addTag(Cacher::newTag('AniTagData',AniTagDataObj)); // Создаем и сразуже добавляем новый тег к слоту перед сохрананеием в кеш
$tag2 = Cacher::newTag('AniTagData2',AniTagDataObj1) // Создаем новый тег
Cacher::addTag($tag2); // добавляем новый тег к слоту перед сохрананеием в кеш
Cacher::set($CacheData); // Кешируем данные
}
...
...
Если затем нужно сбросить какой нибудь тег, то нужно будет сделать так:
Cacher::newTag('AniTagData2',AniTagDataObj1)->clear() // Очищаем кеш тега

Комментариев нет:

Отправить комментарий