CacheExtra

Главные вкладки

Аватар пользователя kayo@drupal.org kayo@drupal.org 9 июля 2009 в 9:38

На площадках с низкой вычислительной производительностью единственным разумным способом оптимизации движка сайта может оказаться только кэширование. В Drupal отсутствует многоуровневое кэширование генерируемого контента, а полное кэширование страниц позволяет оптимизировать отображение информации для анонимных посетителей, но вместе с тем лишает сайт динамичности. Мы попытались реализовать продвинутое многоуровневое контекстнозависимое кэширование содержимого в рамках модуля CacheExtra.

Для тех, кто заинтересовался разработкой, вот краткий список того, что этот модуль делает:

  • Кэширование объектов node;
  • Кэширование страниц материалов (node/$nid);
  • Кэширование главной страницы со списком материалов (node);
  • Кэширование ленты списка материалов (rss.xml);
  • Кэширование страниц материалов по терминам таксономии;
  • Кэширование лент терминов;
  • Кэширование комментариев;
  • Независимое включение/выключение всех кэшей;
  • Автоматическое удаление зависимых кэшей при создании, правке, удалении материалов;
  • Автоматическое удаление зависимых кэшей при добавлении, правке, удалении комментариев;
  • Функция принудительной очистки данных кэша, созданных этим модулем;
  • Возможность отладки кэша;
  • Сохранение в кэше установленного заголовка, breadcrumb, подключенных стилей, скриптов;
  • API для использования возможностей модуля в других модулях, генерирующих контент.

Вывод отладочной информации включается в настройках и показывается пользователям с соответствующей привилегией или при передаче методом GET аргумента CACHEXTRA_DEBUG. Описание API для использования возможностей в других модулях будет чуть позднее.

Также хотелось бы предупредить о возможных проблемах при использовании этого модуля. Например, может неправильно работать выбор шаблонов функциями препроцессинга в движке темы. Хотя отчасти это уже удалось исправить. Также будьте осторожны, если используете глобальные переменные в шаблонах темы. Возможны другие побочные эффекты, которые пока не выяснены.

P.S. Хотелось бы напоследок порекомендовать использование модуля совместно с CacheRouter.

ВложениеРазмер
Двоичные данные cachextra-6.x-1.0-beta.tar_.bz210.42 КБ

Комментарии

Аватар пользователя Химический Али Химический Али 9 июля 2009 в 10:39

Зачем вы повторяете повторяете?

Где же тесты и сравнения с сущестувующими решениями или, по крайней мере, со стандартным механизмом снижения нагрузки?

Аватар пользователя kayo@drupal.org kayo@drupal.org 12 июля 2009 в 11:36

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

Аватар пользователя kayo@drupal.org kayo@drupal.org 12 июля 2009 в 11:41

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

Аватар пользователя kayo@drupal.org kayo@drupal.org 14 июля 2009 в 13:52

Razunter wrote:
boost

This module provides static page caching for Drupal 4.7 (unsupported), 5.x (looking for a maintainer) and 6.x (thread about 6.x development), enabling a very significant performance and scalability boost for heavily-trafficked Drupal sites that receive mostly anonymous traffic.

не то.

Razunter wrote:
authcache

уже интересней, но тоже не то.

Razunter wrote:
cacherouter

[#31523]тут[/#]

снова не то.

Аватар пользователя seaji seaji 13 июля 2009 в 23:02

Не имеет смысла:
* Кэширование объектов node;
* Кэширование страниц материалов (node/$nid);
* Кэширование комментариев;
* Сохранение в кэше установленного заголовка, breadcrumb, подключенных стилей, скриптов;

не пойму в чем отличие:
* Кэширование страниц материалов по терминам таксономии;
* Кэширование лент терминов;

Аватар пользователя kayo@drupal.org kayo@drupal.org 14 июля 2009 в 13:43

Думаю не стоит объяснять чем многоуровневая схема кэширования отличается от кэширования страниц целиком.

Кэширование объектов node имеет смысл, если включено много модулей, использующих nodeapi, поскольку вы избегаете выполнения десятков запросов в node_load. Если это оказывается не эффективно, можно отключить.

У меня есть сайт с фоторепортажами, при просмотре альбома (страница node/$nid) node_load и node_view выполняется множество раз (1 на альбом + N на количество фотографий) не верю, что в этом случае кэширование содержимого таких страниц бесполезно.

Кэширование комментариев ну тут до кучи по желанию.

Если не сохранять в кэше заголовок, breadcrumb, ссылки на подключаемые в процессе формирования кэшируемого содержимого стили и скрипты, все это соответственно не будет восстановлено при загрузке данных из кэша.

Отличие: taxonomy/term/% и taxonomy/term/%/feed, правда я не понял, почему отображение лент для материалов по термину убрали, но это легко включить.

Аватар пользователя seaji seaji 14 июля 2009 в 14:39

"<a href="mailto:kayo@drupal.org">kayo@drupal.org</a>" wrote:
Кэширование объектов node имеет смысл, если включено много модулей, использующих nodeapi, поскольку вы избегаете выполнения десятков запросов в node_load. Если это оказывается не эффективно, можно отключить.

функция node_load() статически кеширует сама в себе объект $node, если вы один раз загрузили ноду, то при последующих вызовах этой функции запросы к базе не повторяются.

Аватар пользователя penexe penexe 14 июля 2009 в 22:25

"seaji" wrote:
функция node_load() статически кеширует сама в себе объект $node, если вы один раз загрузили ноду, то при последующих вызовах этой функции запросы к базе не повторяются.

ну дак человек кладет объект в БД, что эффективнее , но неразумно, тк данные загружаются в зависимости от юзера. модуль poll не даст голосовать например и тд.
если я ошибся поправьте.

Аватар пользователя kayo@drupal.org kayo@drupal.org 15 июля 2009 в 8:14

во-1х данные кэшируются в зависимости от юзера.
во-2х если не ошибаюсь обработка в модуле poll производится не при загрузке.
в-3х при любых изменениях данных этот кэш автоматически сбрасывается.

Аватар пользователя shp shp 15 июля 2009 в 16:17

Кэширование объектов нод, и даже темизированной ноды - очень даже имеет смысл, даже не смотря на то, что они зависят от юзера. Если я, например, знаю, что какие-то ноды всегда одинаковы, почему я не могу включить принудительное кэширование именно этих нод?

Или, как тут уже писали, сделать кэширование по ролям/юзерам (более реально, наверное, первое).

Кстати, я это принудительное кэширование уже предлагал на drupal.org, но они FieldsAPI доводят до ума, и этот вопрос отложили до лучших времен.

Аватар пользователя seaji seaji 15 июля 2009 в 16:38

Нет смысла кешировать ноду т.к. затраты на получение кеша, сопоставимы с затратами на получение ноды.

Аватар пользователя shp shp 16 июля 2009 в 1:10

Я думаю, что получить полностью готовый объект ноды из базы все же быстрее, чем вызов node_load(). Т.е. грубо говоря, простой select по nid.

А про кэширование темизированной ноды и сомневаться нечего, потому что каждая нода темизируется при помощи темплейта, а это долго (ф-ии темизации быстрее). Я сам как-то замерял производительность. Не катастрофично, конечно, но на посещаемом сайте наверняка будет заметно. Точных цифр, к сожалению, предоставить не могу.

Аватар пользователя yexel yexel 18 июля 2009 в 13:22

Похоже, что у вас получается очень интересное решение, но всё-таки также хотелось бы присоединиться:

"Химический Али" wrote:
Где же тесты и сравнения...по крайней мере, со стандартным механизмом снижения нагрузки?

Да, понятно, что Ваше решение значительно провосходит по функционалу эти самые "стандартные механизмы", но Вы ведь сами пишете:
"<a href="mailto:kayo@drupal.org">kayo@drupal.org</a>" wrote:
во-вторых, этот вариант кэширования естественно будет медленнее стандартного кэша страниц

Поэтому будет очень интересно, если Вы расшифруете - насколько медленнее... ну а также - в каких случаях быстрее и также насколько.

Аватар пользователя Steh Steh 7 августа 2009 в 22:44

Мож я туплю слегка, но ниче...

Как я понял - медленнее на процент некешируемых частей. так? Но в то же время при стандартном кешировании все равно происходит проверка страниц на обновление, ну а если закешировать все стабильное раз и навсегда -было бы круто. Лишь бы Сапа, контекст и т.п. работало))

Сделал 15 сателлитов на Вордпрессе. система громоздкая, уже 11,5 мб движок весит. и что там есть)) Вот вспомнил о Друпале и вернулся на сайт. А как было бы хорошо импортировать темы с других движков модулем, а еще выводить в конце адреса кешированных страниц - html, Яша его так любит, у многих не туник все висит и висит ссылками набитый)).

А еще вот чего!Нужен модуль, чтобы рубить пустые места. комментарии в двиге. тогда бы многие модули выполнялись бы быстрее, я думаю. хотя бы чуть. Или я глючу, но уже ночь. До форума не доползу)).