Вы здесь: Статьи Статьи о Joomla! Кэш в CMS Joomla!

Кэш в CMS Joomla!

Кэширование данных позволяет ускорить загрузку сайта и снизить нагрузку на сервер базы данных. В глобальных настройках Joomla! для управления кэшем присутствуют 3 параметра: включение механизма кэширования, директория для хранения файлов кэша и время жизни кэша. В данной статье описывается общий принцип работы механизма кэширования и приведены фрагменты одной из тем форума русского общества Joomla!, посвященной вопросу выбора оптимального времени жизни кэша.

Принцип работы механизма кэширования

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

При последующих обращениях, менеджер кэша Joomla! проверяет, существует ли в кэше объект с заданными параметрами (в том числе названием, содержимым, датой создания, модификации т.д.), если нет — значит материал изменялся или же, просто еще ни разу не кэшировался. Если для запрашиваемого объекта отсутствуют данные в кэше, то перед отображением объекта пользователю эти данные будут помещены в кэш. А если закэшированные данные есть, то вот в этом случае происходит проверка времени кэширования: если дата и время создания кэша отличаются от текущего на интервал больший, чем время жизни кэша, установленное в параметрах конфигурации, то объект будет закэширован заново.

Преимущества длительного кэширования

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

На мой взгляд, оптимальным временем жизни кэша является интервал обновления сайта: если вы добавляете новости не чаще, чем раз в сутки, а на добавление новостей, допустим, у вас уходит 1 час, то время жизни кэша можно смело ставить 82800 секунд (23 часа).

Недостатки длительного кэширования

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

Так как при любом изменении объекта (материала, модуля и т.д.) происходит перегенерация кэша этого объекта, то независимо от времени жизни кэша, измененная статья или модуль будут отображены верно, а вот различные модули, например выводящие списки новых материалов при включенном кэшировании могут немного «врать», поскольку кэш модулей сбрасывается только при измении параметров публикации модуля или по истечению времени жизни кэша. Поэтому для сайтов использующих модули, выводящих часто обновляемую информацию (newsflash, displaynews и т.д.) время жизни кэша лучше устанавливать примерно 80-90% от среднестатистического времени добавления новостей или же вообще отключать кэширование в этих модулях.

Общие выводы

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

Использование кэша в расширениях Joomla!

 

Общие сведения

Для реализации механизма кэширования, разработчики Joomla! используют бесплатную библиотеку Cache_Lite. В качестве менеджера кэша выступает класс JCache_Lite_Function. Данный класс содержит метод call, позволяющий вызвать произвольную функцию по имени и передать ей на вход указанные параметры. При вызове этого метода, в качестве первого параметра указывается имя функции, а далее — произвольное количество переменных, являющихся параметрами этой функции.

При вызове метода call, происходит поиск файла кэша для этой функции и заданного набора параметров. Если такой файл найден, и время жизни этого закэшированного объекта не истекло, то вместо реального вызова функции, происходит возврат данных из файла. Если файл не найден, то это означает, что данная функция с такими параметрами еще не вызывалась. В этом случае происходит вызов функции, с передачей ей на вход указанных параметров, а результат работы функции помещает в кэш.

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

Доступ к объекту менеджера кэша JCache_Lite_Function осуществляется через класс mosCache, который содержит всего 2 метода:

  • getCache($group='')

    Фабричный статический метод, возвращающий ссылку на объект менеджера кэша для заданной группы. В качестве имени группы может выступать любой текстовый идентификатор. Обычно, в качестве имени группы, используют имя компонента (например com_content).

  • cleanCache($group=false)

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

Рассмотрим пример работы с классом mosCache:

 
 // функция, результат работы которой необходимо закэшировать
function myfunction($arg1, $arg2, $arg3) {
  return $arg1 . $arg2 . $arg3;
}
 
// получаем экземпляр JCache_Lite_Function для нашего расширения
$cache =& mosCache::getCache('com_mycomponent' );
 
// вызываем функцию посредством менеджера кэша JCache_Lite_Function
echo $cache->call('myfunction', $arg1, $arg2, $arg3 );

Теперь, давайте рассмотрим как это будет работает. При вызове метода call менеджер кэша, проверит наличие функции myfunction, затем, попробует найти закэшированные данные для данной функции с указанными значениями параметров. Если найдет, то вернет данные из кэша, в противном случае — он вызовет данную функцию и передаст ей параметры $arg1, $arg2 и $arg3. А результат работы функции поместит в кэш, чтобы при следующем обращении не вызывать функцию.

ПРИМЕЧАНИЕ: класс использует параметры глобальной конфигурации Joomla для управления менеджером кэша JCache_Lite_Function. Т.е. если в глобальных настройках выключить кэш, то менеджер кэша в функции call будет всегда производить явный вызов указанной функции, не пытаясь найти закэшированные объекты. Поэтому, если вы хотите управлять кэшированием данных, вне зависимости от параметров глобальной конфигурации Joomla!, необходимо использовать JCache_Lite_Function напрямую.

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

Рассмотрим пример работы с классом JCache_Lite_Function:

 
 // функция, результат работы которой необходимо закэшировать
function myfunction($arg1, $arg2, $arg3) {
  return $arg1 . $arg2 . $arg3;
}
 
// параметры конфигурации Joomla
global $mosConfig_absolute_path, $mosConfig_cachepath;
 
// подключаем файл с определением класса JCache_Lite_Function
require_once( $mosConfig_absolute_path . '/includes/joomla.cache.php' );
 
// формируем массив параметров
  $options = array(
    // директория для хранения файлов кэша
    'cacheDir'     => $mosConfig_cachepath . '/',
    // флаг включения/отключения кэширования
    'caching'     => 1,
    // название группы объектов
    'defaultGroup'   => 'com_mycomponent',
    // время жизни кэша — 3600 секунд или 1 час
    'lifeTime'     => 3600
  );
 
// получаем экземпляр JCache_Lite_Function для нашего расширения
$cache = new JCache_Lite_Function( $options );
 
// вызываем функцию посредством менеджера кэша JCache_Lite_Function
echo $cache->call('myfunction', $arg1, $arg2, $arg3 );

Принцип работы данного примера отличается от предыдушего только тем, что мы явно включаем использование кэширования (вне зависимости от настроек Joomla!) и указываем свое время жизни кэша.

smart


 

Комментарии  

Коммент от
Авг 04, 2008
Комментатор
Брикалов Константин
+3 Отличная статья. Пять баллов. Как раз хотел узнать как реализуется кэш, очень нужно было и вот статья!!!! кРУТО.

сПАСИБО!!
Коммент от
Дек 03, 2008
Комментатор
Вадим
+2 :lol: Согласен, статья отличная! Интересно почему Мамбо не использует полное кэширование страницы.
Коммент от
Янв 09, 2009
Комментатор
256
+3 Спасибо за хорошую компиляцию ;-)
Коммент от
Фев 05, 2009
Комментатор
Aleks_EL_Dia
0 Спасибо не мне, а автору статьи smart'у ;-)
Коммент от
Фев 22, 2009
Комментатор
Aleks_El_Dia
0 Возможно появится продолжение статьи о кэше в Joomla! 1.5 от Kotofeich'a
Коммент от
Мар 14, 2009
Комментатор
maxo127
0 Странно, а трудно было сделать так, чтоб при любом изменений происходило перекешировка или стирание?
Коммент от
Мар 14, 2009
Комментатор
Вадим
0 Цитирую maxo127:
Странно, а трудно было сделать так, чтоб при любом изменений происходило перекешировка или стирание?

Для этого необходимо использовать мод Apache Memcache + к БД через специальные функции.

В Durpal для этого есть модуль Memcache and Integration, который позволяет во много раз сократить нагрузку на Базу. В общем и для мамбы это возможно сделать.

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

Защитный код
Обновить

Популярные файлы

1.
Компонент Миграции с Joomla! 1.0.x на Joomla! 1.5.x
2092
2.
Хак постраничной навигации сайта на CMS Joomla!
869
3.
Дополнительное изменяемое поле "Телефон"
509

Последние комментарии

  • Так введите это имя и пароль/мыло админа и заканч... Подробнее..
    От Aleks_El_Dia
  • делал, делал, миграция прошла успешно, жму далее -... Подробнее..
    От Вася
  • Ссылочка битая. Если всё же появится время - пожа... Подробнее..
    От skai