Кеш в joomla - розбираємося в деталях
Навіщо використовувати кеш?
Але давайте повернемося до Joomla, і якщо бути більш точним, тут ми маємо справу з кешуванням веб-додатки - створенням тимчасових статичних копій динамічних сторінок (або більш дрібних одиниць інформації). Кешування властиво для веб-додатків, так як типовий веб-сайт відображає один і той же контент знову і знову, і без кеша доводилося б все генерувати заново для кожного показу сторінки. Система кешування тимчасово зберігає сгенерированную кодом інформацію в об'єкті кешу, і віддає її назад, коли вона запитується наступним користувачем.
Типи кеша в Joomla
Кеш сторінки (Page cache)
Робить знімки цілої сторінки, включаючи все: компоненти, модулі, плагіни і шаблон. Це найшвидший, але при цьому найменш гнучкий підхід кешування. Для його активації необхідно включити плагін «Система - Кеш».

Прогресивний кеш (Progressive cache)
Це тип кешу з'явився в Joomla 1.6. Він робить знімки кожного унікального набору модулів (зазвичай кожної сторінки). Впливає на всі модулі і працює як шар над кешем модулів, перевизначаючи їх налаштування. Показує контент індивідуально для кожного відвідувача. Чи включається при установці рівня кешу в значення «Прогресивний» в загальних налаштуваннях сайту.

Стандартний кеш (Conservative cache)
Якщо вам потрібен більш тонкий контроль над кожним кешем модулів окремо, то використовуйте стандартний рівень кешування. Ще одне його відмінність від прогресивного кеша в тому, що він показує один і той же закешовану контент всім відвідувачам веб-сайту.
Кеш модуля та подання компонента
Вони формують своєрідну групу, так як обидва створюють статичну копію повних вихідних даних компонента або модуля. Це найбільш поширений тип кешу, який іноді прирівнюють до кешуванню в Joomla в загальному.
Його позитивною стороною є те, що він добре проявляє себе в плані швидкості. А негативна сторона полягає в тому, що він відключає будь-яка взаємодія користувач<->розширення<->фреймворк, поки не закінчиться закешовану копія. Це означає, що він не підходить для компонентів або модулів, які реагують на дії користувача або відображають часто змінюваний контент.
Так як закешовану копія модуля або компонента містить тільки власні вихідні дані, будь-який зовнішній файл, який буде викликаний за допомогою таких методів як $ document-> addStyleSheet () не підключений. Були придумані різні обхідні рішення, але всі вони вимагають додаткових обчислювальних ресурсів, що зменшує ефект використання кешування.
Кешування уявлення компонента
Кешування уявлення компонента здійснюється за допомогою методу display ($ cachable, $ safeurlparams) контролера. Для цього параметр $ cachebale необхідно встановити в значення true. а через параметр $ urlparams передати масиву URL-параметрів і їх типів фільтра:
При цьому масив URL-параметрів формує унікальний cache id.

Режими кешування модуля
Існує 5 різних режимів кешування модуля. Три з них активуються через поле cachemode в XML-файлі маніфесту модуля:
- static - буде використовуватися один кеш-файл для всіх сторінок з однаковими параметрами модуля. Рекомендується для модулів, які не змінюються.
- itemid - змінюється при зміні Itemid. Такий режим найбільше підходить для динамічних модулів, які змінюються від сторінки до сторінки, наприклад: меню, зображення контенту і т.п.
- oldstatic - назад сумісний з Joomla 1.5 режим.
Ще два режиму кешування повинні викликатися безпосередньо з модуля:
Для використання цих двох режимів, замість поля cachemode використовуйте поле owncache в XML-файлі маніфесту:
І далі викличте метод JModuleHelper :: moduleCache ($ module, $ moduleparams, $ cacheparams) з точки входу модуля.
Властивості об'єкта, які передаються в метод moduleCache (). не вимагають особливих роз'яснень. Як приклад можна взяти модуль пов'язаних матеріалів (mod_related_items), який використовує режим safeuri і замінює некешірованную функцію modRelatedItemsHelper :: getList ($ params):

Кеш зворотного виклику (Callback cache)
Цей тип кешу дозволяє диференціювати різні частини розширення і кешувати тільки ті, які потрібно кешувати, при цьому залишаючи динамічні частини некешіруемимі. Кешируєт результати виклику функції в коді.
Кеш вихідних даних (Output cache)
Кешируєт вихідні дані деякої частини скрипта. В основному це output buffering з кешуванням, і використовується досить рідко.
Raw-кеш (Raw cache)
Кешируєт будь-які елементи даних. Повністю контролюється розробником - що зберігати, коли зберігати і як класифікувати збережені елементи (cache id). Це тип кешу часто використовується ядром Joomla для різних операцій: список компонентів, список модулів, дерево меню, доступні мови, групи користувачів і т.п.
Обхідні рішення (Workarounds)
setWorkarounds
Метод JCache :: setWorkarounds ($ data, $ options = array ()) готує дані, які будуть збережені в кеші разом з обхідними рішеннями, і приймає такі опції:
- nopathway - Ніколи не зберігати pathway дані
- nohead - Ніколи не зберігати header дані
- nomodules - Ніколи не зберігати дані модуля
- modulemode - якщо nohead одно 0, не зберігати такі дані модуля: title. description. link. metaTags
getWorkarounds
Метод JCache :: getWorkarounds ($ data, $ options = array ()) застосовує обхідні рішення над даними, збереженими з обхідними рішеннями. Він відтворює header, pathway і модулі і повертає основні збережені дані. Працює автоматично - конкретне обхідний рішення виконується, тільки якщо його дані були збережені окремо.
Різниця в використанні кеша зворотного виклику і raw-кеша
Зазвичай при розробці компонента цілком достатньо кеша уявлення, особливо це стосується простих компонентів. Але якщо компонент створює контент на льоту, то найкраще вибрати інший тип кешу. У такій ситуації буде зручний кеш зворотного виклику або raw-кеш.
Кеш зворотного виклику функції поверне в точності той же результат, який би повернула незакешірованная функція, тільки цей результат буде закешовану. Безпосередньо функція буде викликана тільки при першому зверненні до неї.
Ми викликаємо кешування за допомогою JFactory :: getCache (). і якщо ми використовуємо кеш зворотного виклику, наш код повинен виглядати наступним чином:
Останні три параметра в методі get () є необов'язковими.
Зверніть увагу на те, що цей не той же метод get (). який ми використовуємо в raw-cache. Кеш зворотного виклику автоматично отримує дані, якщо вони існують. Якщо їх немає, то він виконує зворотний виклик, повертає дані з зворотного виклику і зберігає їх до наступного виклику. У кеша зворотного виклику не існує методу store ()!
При використанні raw-кеша у розробника є прямий доступ до методів get () і store (). і за логіку відповідальний безпосередньо розробник. Цей кеш зручний, коли необхідно зберегти інформацію, але не виклик функції (наприклад: xml-дані, картинки, опис товарів і т.п.), або коли необхідно передати великий обсяг даних з однієї сторінки на іншу.
Нижче наведено код використання raw-кеша:
Щоб використовувати raw-кеш, як другий параметр методу getCache () ми повинні передати порожній рядок.
Що трапиться, якщо кілька кешей будуть працювати одночасно?
Типи кешей працюють як непрозорі шари один над одним (виключаючи кеш модуля / уявлення компонента, який працює паралельно). Щоб це зрозуміти, ми повинні уявити, що дивимося на веб-сторінку зверху, де кеш сторінки представляє верхній рівень, в той час як кеш зворотного виклику, вихідних даних і raw-кеш представляють нижній рівень. Виходить, що верхні рівні перекривають нижні, і наприклад, при використанні кеша сторінки увесь інший кеш перестає діяти.
Але є виключення, коли ми використовуємо різний час для різних типів кеша. Наприклад, ми можемо кешувати сторінки протягом короткого проміжку часу і кешувати зображення протягом довгого. В такому випадку, при рендеринге сторінки зображення буде витягатися з кешу.
обробники кеша
Обробники кеша - це чорнороби. Саме вони виконують всю чорнову роботу і зберігають інформацію на обраному медіа. Для використання кеша повинен бути доступний хоча б один обробник кешу.
За замовчуванням Joomla використовує File як обробника кешу, який використовує файли для збереження інформації. Такий обробник працює надійно, але він повільніше в порівнянні з обработчиками, які ґрунтуються на роботі з оперативною пам'яттю. Якщо файловий обробник недоступний, то необхідно виправити права доступу до папки cache. щоб веб-сервер міг записувати в неї інформацію.
Файли також використовує обробник Cache_Lite. Крім того, в Joomla можна використовувати: APC, eAccelerator, Memcached, XCache, WinCache і Redis. Всі вони використовують оперативну пам'ять.