Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Механическое тегирование кеша в Yii

Anna | 31.05.2014 | нет комментариев

Кеширование с тегами — инструмент, дозволяющий точечно обновлять кеш при изменении тех либо иных зависимостей.
К сожалению, разработчики Yii не сочли необходимым внедрить данный инструмент в ActiveRecord, а стоило бы. Тем не менее, они дали нам вероятность сделать это самим.

Реализация привязки тегов к моделям на основе зависимостей теснее обсуждалась на прогреhabrahabr.ru/post/159079/. Автору отдельная признательность. Я буду применять ее как основу, и дополню функциями для механической генерации тегов.

Выделим задачи, которые нам придется решить:

 

Генерация тегов по предопределённым правилам. (стандартизация)

Так как в плане имеется уйма разных сущностей, и объединяющие ключи сформированы без определённых эталонов, то нам необходим метод применять один тег для столбцов, название которых отличается. Скажем, в одной таблице имеем поле user_id, а в иной имеем поле customer_id, оба столбца ссылаются на сущность user. Разумно что они обязаны зависеть от одного и того же тега — user_id.

Механическая генерация тегов

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

Вероятность добавить теги вручную

Как бы мы не хотели автоматизировать процесс по максимуму, все таки, найдётся довольно обстановок, когда необходимо указать теги вручную.
Скажем, когда выборка модели осуществляется с использованием трудного запроса (применяется CDbCriteria). Для этого, мы расширим класс CDbCriteria добавив ему качество $tags, по которому генератор тегов осознает что есть теги добавленные «вручную».

Реализация:

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

Дальнейшая задача — это определение какой же тег должен быть удален при изменении определённой модели. При чтении мы создаем/проверяем все теги от которых зависит модель. При записи мы обязаны удалить только индивидуальные теги. Невозможно удалять теги от которых зависят и другие модели.

Для решения данной задачи, к сожалению, я был вынужден поделить правила на две группы, соответствующие режимам «чтение» и «запись». Это разрешает нам определить какие теги будут использованы при чтении и какие необходимо удалить при записи. Придется вручную определять эти моменты.

Правила будем беречь в способе модели cacheTags($mode=’read’). Тот, что должен возвращать массив. Так же, определим, что если cacheTags не объявлен в модели либо возвращает пустой массив, то механическое кеширование не будет активировано.

Всякий тег будет иметь префикс, состоящий из имени модели в нижнем регистре, т.е. user_id — это тег для свойства id в модели User.

Заходя вперед скажу что, во время реализации пришлось определить несколько видов правил:

  • Статический
  • Константа
  • Ссылка
  • Композитный

Статический — линейный элемент массива, значение которого соответствует какому либо столбцу таблицы. Тег будет состоять из префикса и нынешнего имени правила.

Константа — значение, с главенствующим символом ‘:’, которое будет применяться взамен имени тега, заранее удалив символ ‘:’. Другими словами, в название тега не будет добавлен всеобщий префикс.

Ссылка — ассоциативный элемент массива, ключ которого соответствует столбцу таблицы, для именования тега будет применяться значение правила. При этом значение правила может быть представлено в виде других правил.

Композиция — это массив правил. Будет сделан соответствующий композитный тег

Пример:

public function cacheTags($mode='read'){
        switch ($mode) {
            case 'read':
                return array(
                   'id', // статический
                   'user_id'=>':user_id', // ссылка, при этом значение ссылки предстаqvmk!/h6>
Добавление тегов вручную.
$criteria = new \Yiix\Cache\Tagged\CDbCriteria();
$criteria->addInCondition('authorId', array('1','2'));
$criteria->tags = array(
        'authorId'=>array('1','2'),
);

$tags = \Yiix\Cache\Tagged\Helper::generateTags(Post::model(),$criteria);
dump($tags);

 итог:
array
(
    0 => 'user_id=1'
    1 => 'user_id=2'
)

тут мы видим, что сработало правило «ссылка» и название тегов соответствуют сущности User

Эти примеры не будут применяться напрямую. Они описывают правило создания тегов, тот, что применяется в Yiix/Cache/Tagging/CActiveRecord.

В библиотеке применяется пространство имен. Информация по настройке пространства имен описана тут:
yiiframework.ru/doc/guide/ru/basics.namespace

Спасибо за внимание.

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB