Кешування об'єктів в wordpress - wp magazine

У нашій статті про основи кешування в WordPress ми коротко згадували про кешуванні об'єктів. У цій статті ми постараємося розглянути всі можливості класу WP_Object_Cache. деякі нюанси, і чому кешування об'єктів грає важливу роль в продуктивності сайтів на WordPress.

Що таке кешування об'єктів

Кешування об'єктів в WordPress (object cache), це вбудований механізм системи, який дозволяє зберігати дані довільного типу, і отримувати ці дані при необхідності. Цей кеш використовується для того, щоб зберігати результати виконання складних операцій.

Щоб зрозуміти принцип роботи кеша об'єктів в WordPress, розглянемо простий приклад функції, яка виконує запит до бази даних:

Якщо викликати цю функцію кілька разів поспіль, то кожен раз ми будемо виконувати запит в базу даних:

Функцію foo () можна легко прискорити за допомогою кешування об'єктів в WordPress, помістивши результат виконання запиту в кеш наступним чином:

Функції для роботи з кешем об'єктів і їх параметри ми розглянемо трохи пізніше. Тут важливо зрозуміти, що перша частина функції шукає збережене значення в кеші об'єктів, і видає його якщо воно знайдено. Якщо значення в кеші не виявилося, то ми його отримуємо за допомогою запиту в базу даних, зберігаємо в кеш і повертаємо результат.

Таким чином, тільки перше звернення до функції foo () виконає запит до бази даних, а наступні звернення повернуть результат істотно швидше за допомогою кеша:

Якщо ваша відповідь «один», то принцип роботи кешування об'єктів ви засвоїли. Проте, правильною відповіддю тут є «нуль» через особливості роботи опцій з кешем об'єктів в WordPress. Подробиці ми розглянемо в кінці статті.

Основні функції кешування об'єктів

Кешування об'єктів в WordPress реалізовано класом WP_Object_Cache. але звертатися до його методам легко через допоміжні функції.

wp_cache_get ()

Функція wp_cache_get () читає значення з кешу об'єктів по заданому ключу. Якщо значення з таким ключем не існує, функція wp_cache_get () повертає false. Параметри функції:

  • $ Key - ключ за яким виконується пошук
  • $ Group - група в якій проводиться пошук, якщо група не задана мається на увазі група за замовчуванням «default», параметр не обов'язковий

У функції wp_cache_get () є також два додаткові параметри, які використовуються вкрай рідко.

Параметр $ found приймає змінну за посиланням, і встановлює її в значення true або false. в залежності від того, чи було знайдено значення в кеші чи ні. Цей параметр корисний в тому випадку, коли значення, яке зберігається в кеші об'єктів може бути булевим false.

wp_cache_add ()

Функція wp_cache_add () додає значення в кеш об'єктів по заданому ключу. Якщо значення з таким ключем вже існує в кеші об'єктів WordPress, то функція wp_cache_add () нічого не робить і повертає false. Параметри функції:

  • $ Key - унікальний ключ, за яким значення може бути знайдено
  • $ Data - значення зберігається в кеш об'єктів
  • $ Group - група, яка дозволяє використовувати один і той же ключ в різному контексті, значення за замовчуванням - «default», параметр не обов'язковий
  • $ Expire - максимальний час життя значення в кеші, використовується тільки в деяких плагінах зовнішнього кешування об'єктів, параметр не обов'язковий

wp_cache_set ()

Функція wp_cache_set () схожа на wp_cache_add () і приймає ті ж самі параметри. Вона зберігає задане значення в кеші об'єктів WordPress. Єдиною відмінністю є те, що функція wp_cache_set () встановить значення в кеш, навіть якщо воно вже існує. Якщо значення в кеші немає, то wp_cache_set () його додасть.

wp_cache_replace ()

Функція wp_cache_replace () теж схожа на wp_cache_add () і wp_cache_set (). і приймає ті ж самі параметри. Функція wp_cache_replace () замінює існуюче значення в кеші об'єктів. Вона відрізняється тим, що якщо значення, не знайдено в кеші об'єктів, нове значення функція додавати не буде.

wp_cache_delete ()

Функція wp_cache_delete () видаляє значення з кешу об'єктів по заданому ключу. Параметри ті ж, що і у функції wp_cache_get (). Функція поверне true якщо значення було знайдено і вилучено, інакше false. приклад:

wp_cache_incr () і wp_cache_decr ()

Функції wp_cache_incr () і wp_cache_decr () дозволяють інкрементіровать або декрементіровать значення в кеші об'єктів. Ці функції особливо корисні при роботі з будь-якими лічильниками. приклади:

wp_cache_flush ()

Функція wp_cache_flush () скидає весь кеш об'єктів WordPress. Користуватися цією функцією варто з особливою обережністю, оскільки вона може стати причиною зниженої продуктивності WordPress.

Сталість кешу об'єктів

Одним з ключових моментів кешування об'єктів в WordPress є те, що за замовчуванням кеш є непостійним. Це означає що всі значення в кеші зберігаються тільки протягом одного запиту, а при наступному запиті вашої сторінки WordPress, кеш об'єктів знову порожній.

На перший погляд такий кеш не надто корисний, але якщо порахувати наприклад, скільки разів за один запит WordPress виконує функцію get_option (). то вигода від кешування об'єктів стає очевидною.

Так само в WordPress є можливість використовувати зовнішнє сховище для кешу об'єктів, наприклад сервер Memcached або APC, при цьому кеш об'єктів в WordPress стає постійним. Це означає що при наступному зверненні до вашої сторінці, раніше закешовану значення стають доступними.

Зовнішній постійний кеш об'єктів

Зовнішній / постійний кеш об'єктів (external / persistent object cache) в WordPress реалізується виключно у вигляді плагіна, наприклад:

Дані плагіни дозволяють використовувати сервери Memcached, APC або Redis відповідно, для кешування об'єктів в WordPress. При використанні зовнішнього кешування потрібно так само мати уявлення про те, скільки пам'яті потрібно для ваших найчастіших об'єктів, щоб правильно настроїти сервер-сховище.

Якщо ви розробляєте плагін для WordPress, в якому поведінка залежить від наявності зовнішнього кешування об'єктів, скористайтеся функцією wp_using_ext_object_cache ():

В даному простому прикладі ми зберігаємо значення в кеші об'єктів тільки якщо кеш є зовнішнім і постійним. Якщо плагін для зовнішнього кешування об'єктів відсутня, то буде використовуватися опція.

При роботі з плагінами зовнішнього кешування об'єктів з'являється нове поняття «локальний кеш об'єктів». Це означає, що при повторному запиті одного і того ж ключа, об'єктний кеш не робитиме повторний запит на сервер Memcached, а видасть значення з локального кеша.

Деякі плагіни зовнішнього кешування реалізують параметр $ force за допомогою якого можна вплинути на цю поведінку.

У більшості функцій кешування об'єктів є параметр $ group. який дозволяє використовувати один і той же ключ в різному контексті.

Теоретично це лише додатковий префікс до ключу, але на практиці групи мають велике значення при роботі з WordPress в режимі мережі (Мультисайт) або при використанні плагінів для зовнішнього кешування об'єктів.

В ядрі WordPress використовується кілька різних груп, наприклад:

Групи в WordPress діляться на глобальні і не глобальні, а так само на постійні і непостійні.

Глобальні групи

Глобальні групи в WordPress мають значення тільки при роботі з WordPress в режимі мережі. За замовчуванням кеш об'єктів додає префікс з ідентифікатором поточного сайту (blog id) до кожного ключу в кеші об'єктів.

Найочевиднішим прикладом глобальної групи в WordPress є група «users», оскільки користувачі в WordPress беруться з однієї глобальної таблиці, незалежно від поточного сайту в мережі. Іншими прикладами глобальних груп є: «themes», «blog-details», «site-options», «site-transient».

При бажанні в список глобальних груп ви можете додати і власну групу за допомогою функції wp_cache_add_global_groups ():

постійні групи

Постійні групи в кеші об'єктів WordPress - це ті групи, які використовують зовнішнє постійне кешування об'єктів, при наявності плагіна. Якщо не визначено інакше, кожна група є постійною за замовчуванням, а виключити групу з постійних можна за допомогою функції wp_cache_add_non_persistent_groups ():

Таким чином, при роботі з плагіном зовнішнього кешування, наприклад Memcached Object Cache, і при збереженні значень в групі «my-group», значення буде збережено тільки в локальному кеші об'єктів, і не буде зберігатися на сервер Memcached.

В ядрі WordPress за замовчуванням визначено кілька непостійних груп: «comment», «counts», «themes» і «plugins». Всі інші групи, включаючи групу «default» в WordPress є постійними.

Відключення кешу об'єктів

Коли вам необхідно отримати дані за допомогою вбудованих функцій WordPress, але при цьому не зберігати отримані дані в кеш, ви можете на час відключити додавання в кеш за допомогою функції wp_suspend_cache_addition (). Це може бути корисним наприклад при імпорті великої кількості даних:

Подібним чином за допомогою функції wp_suspend_cache_invalidation () можна відключити можливість скидання кешу, правда на даний момент ця функція працює тільки для кеша записів, і тільки при спробі його скинути за допомогою функції clean_post_cache ().

Об'єктний кеш і опції

Опції в WordPress мають особливе ставлення з кешем об'єктів. Це легко побачити в реалізації функції get_option (). яка при самому першому зверненні викличе вбудовану функцію wp_load_alloptions (). яка в свою чергу завантажить всі опції з позначкою autoload в базі даних WordPress.

Перший раз функція get_option () викликається в ядрі WordPress ще до того, як завантажиться наша активна тема, і саме тому при зверненні до get_option () для того, щоб отримати назву сайту, опис та інше, запитів в базу даних ніяких не буде:

Даний код не виконає жодного запиту в базу даних WordPress.

З цієї причини розробникам тим і плагінів WordPress не варто боятися таких функцій як get_option (). bloginfo (). або get_post_meta () (використовує подібний підхід до кешуванню), а поради «прибрати звернення до get_option () для того, щоб прискорити сайт» можна сміливо ігнорувати.

висновок

У налагодженні проблем з кешем об'єктів в WordPress допоможе популярний плагін Debug Bar.

Кешування об'єктів в wordpress - wp magazine

Робота з кешем об'єктів в Debug Bar

У Debug Bar можна подивитися статистику звернень в кеш об'єктів і споживану пам'ять кожною групою, а при наявності зовнішнього кешування об'єктів, Debug Bar покаже кожне звернення до зовнішнього сервера.