Создание, продвижение сайтов
40-33-54

Entity cache и Display Cache - комплексное кеширование сущностей

06 марта 2017

В Drupal 7 одним из главных нововведений было появление новой концепции сущностей (Entity). К сущностям относятся: ноды, комментарии, пользователи, термины таксономии и другие. К сущностям также можно крепить любой набор полей. Но, наверняка, многие знают о проблемах с производительностью при загрузке объектов сущности и дальнейшем их рендеринге, отрисовке в html код для вывода на страницу. А в особенности, если выводится сразу много сущностей, да еще и если к ним прикреплено штук пару-пятнадцать полей.

Для анонимных пользователей можно конечно же закешировать всю страницу (cache page) и отдавать каждому последующему посетителю страницу целиком из кеша. Для авторизованных пользователей все обстоит немного посложнее, ибо для них некоторые элементы страниц будут отличаться.

Многие стараются избежать при выводе материалов модулем views сущностей целиком, чтобы избежать вызовов node_load() для загрузки объектов нод. Вместо этого выбирают вывод только нужных полей. Также существует возможность закешировать вьюс на определенное время, также как и панели. Но, что делать если в какой-либо ноде изменилось какое то поле или же нода была удалена. По хорошему хотелось бы, чтобы и кеш вьюса или панели "освежился".

Для задачи хранения в кеше сформированных объектов сущностей, чтобы избежать постоянных вызовов entity_load(), имеется модуль Entity cache. Он поддерживает все сущности ядра drupal. Он очень прост в использовании - его просто достаточно установить и включить. Он будет все объекты сам ложить в сериализованном виде в кеш и в последующем вместо полной загрузки объекты будут браться из кеша. В Drupal 8 функционал модуля уже включен в ядро.

Чтобы избежать последующего процесса рендеринга, можно воспользоваться модулем Display Cache. Он сохраняет в кеш уже готовый html вывод сущностей целиком или же опционально только полей сущности. При этом он позволяет достаточно гибко настроить кеширование для каждой сущности и для каждого view mode.

Рассмотрим установку и настройку модуля Display Cache поподробней. Для установки его нужно стандартно скачать со страницы проекта, разархивировать и положить в каталог sites/all/modules (sites/all/modules/contrib). И далее включаем его на странице /admin/modules. Для пользователей drush все еще проще - просто выполняем команду:


drush en -y display_cache

Далее для примера рассмотрим настройку кеширования типа материала article и его view mode "teaser". Переходим на страницу настроек типа материала и открываем вкладку "Manage display" (страница /admin/structure/types/manage/article/display/teaser). В филдсете "DISPLAY CACHE DISPLAY SETTINGS" находятся настройки кеширования:

display cache settings

Для каждого view mode можно выбрать: No caching (вообще не кешировать этот view mode), Cache display (кешировать вывод целиком), Cache fields only (кешировать только вывод полей). При выборе кеширования полностью, вывод полей все равно будет ложиться в кеш. Это необходимо для того, чтобы при изменении одного поля, при рендеринге ноды остальные поля сразу брались из кеша.

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

При выборе же кеширования только полей, можно будет дополнительно в филдсете "DISPLAY CACHE FIELD SETTINGS" выбрать, какие поля нужно кешировать.

Для очистки display cache можно воспользоваться drush командой:


drush cc display-cache 

Либо же перейти на страницу /admin/config/development/display-cache и нажать кнопку "Flush all display caches". Для более тонкой возможности по очистке кеша, можно также воспользоваться модулем UI Cache Clear (автор kalabro). Модуль позволяет очищать кеш блоков, панелей, вьюсов, path breadcrumbs и страниц. Для очистки кеша используются контекстные ссылки, а кеш страниц можно очистить из admin menu. Он с недавнего времени интегрирован с entity cache и display cache. Правда ограничен только нодами. Зато можно очистить кеш отдельно каждой ноды. Для этого модуль добавляет контекстные ссылки при выводе материалов и вкладки на страницах нод.

Подводя итоги, такое комплексное кеширование сущностей несомненно пригодиться для сайтов, которые посещают авторизованные пользователи и конечно же при большом количестве прикрепленных полей к сущностям. Для случаев, если не хватает стандартных view mode, можно воспользоваться либо хуком hook_entity_view_mode_alter, либо модулем Entity view modes. Также не лишним будет вынести кеш из базы данных в Memcache или же Redis.

Сделайте заказ с сайта и получите 10% скидку на услугу

Заказ услуги с сайта raybin.ru

Нажимая на кнопку "Получить консультацию", я даю согласие на обработку персональных данных и соглашаюсь c условиями политики конфиденциальности
CAPTCHA
Этот вопрос задается для того, чтобы выяснить, являетесь ли Вы человеком или представляете из себя автоматическую спам-рассылку.
Заказать бесплатную SEO-консультацию

Запрос бесплатной SEO - консультации с сайта raybin.ru

Нажимая на кнопку "Получить консультацию", я даю согласие на обработку персональных данных и соглашаюсь c условиями политики конфиденциальности
CAPTCHA
Этот вопрос задается для того, чтобы выяснить, являетесь ли Вы человеком или представляете из себя автоматическую спам-рассылку.
Письмо в компанию Райбин

Письмо в компанию RAYBIN

Нажимая на кнопку "Получить консультацию", я даю согласие на обработку персональных данных и соглашаюсь c условиями политики конфиденциальности
CAPTCHA
Этот вопрос задается для того, чтобы выяснить, являетесь ли Вы человеком или представляете из себя автоматическую спам-рассылку.