Кеш об'єктів скрізь
WordPress намагається максимально зменшити кількість запитів до бази даних.
Наприклад, щоразу, коли ви отримуєте метаполя або поле таксономії, перед тим, як запитувати базу даних, WordPress виглядає, якщо це вже було запитано і збережено в кеші, і повертає його звідти замість запиту до бази даних.
"Завдання кешу" виконується за допомогою WP_Object_Cache
класу та wp_cache_*
функцій (які обгортки методів цього класу.)
Де живе кеш
За замовчуванням "кеш" - це не що інше, як глобальна змінна PHP. Це означає, що воно є в пам'яті, але також означає, що воно зникає при кожному запиті.
Однак за допомогою дроплінгів ( advanced-cache.php
та / або object-cache.php
) можна встановити власний спосіб обробки цього кешу.
Зазвичай ці краплі використовуються для налаштування якогось механізму кешування, який "переживає" сингулярні запити.
З цієї причини серед WP люди знають як "стійкі кеші" плагіни (навіть якщо поза міхуром слова "кеш" і "стійкий" не мають великого сенсу разом).
У наш час популярними варіантами є Memcached або Redis .
Таким чином, використовуючи «стійкий кеш» плагіни, ви можете різко зменшити кількість запитів до бази даних, оскільки кеш не оновлюється в кожному запиті.
Деякі приклади
$foo = get_post_meta('foo', $post_id, true);
// a lot of code in the middle
$bar = get_post_meta('bar', $post_id, true);
Дві рядки коду, що викладені вище, викликають максимум 1 запит до бази даних.
Насправді, коли ви запитуєте користувацьке поле, усі поля для цієї публікації витягуються з бази даних, кешуються за допомогою кеш-об’єктів, а наступні запити витягують дані з кеша, а не з db.
Те ж саме відбувається і з термінами систематики, WordPress витягує всі терміни для таксономії один раз, а потім повертає їх з кешу.
Об'єктний кеш дуже широко використовується в WordPress. Не тільки для публікацій, мета-значень та систематики, але й для користувачів, коментарів, даних тем ...
Що WP_Query
стосується всього цього?
Коли ви запитуєте деякі записи WP_Query
за замовчуванням, WordPress не тільки витягує їх з бази даних (або з кешу, якщо вони кешовані), але й оновлює кеш для всіх спеціальних полів і всіх таксономій, пов'язаних із витягнутими публікаціями.
Отже, коли ви телефонуєте, наприклад, get_the_terms()
або get_post_meta()
під час циклу публікацій, отриманих за допомогою WP_Query
, ви насправді не викликаєте жодного запиту бази даних, але витягуєте інформацію з кешу.
Приємно, чи не так?
Ну так, але це коштує з вартістю.
"Магія" кеш-оновлення кеш-пам'яті, що робить WordPress, коли тягне повідомлення через WP_Query
буття update_meta_cache
для мета та в update_object_term_cache
таксономії.
Якщо ви подивитеся на вихідний код цих функцій, то побачите, що там WordPress виконує лише один db-запит у кожній функції, але також робить багато обробки. Наприклад, update_object_term_cache
там є 7 вкладенихforeach
... якщо у вас багато таксономій, а кількість публікацій на сторінці висока, це не дуже ефективно.
Про ці WP_Query
аргументи, нарешті
Що 'update_post_meta_cache'
і 'update_post_term_cache'
робити, коли встановлено, щоб false
не допустити WordPress оновлювати кеш для спеціальних полів та таксономій відповідно.
У цьому випадку, коли вперше запитується користувацьке поле або систематика, ініціюється запит бази даних, а дані кешуються.
Варто клопоту?
Як завжди, відповідь - це залежить . Більшість випадків для встановлення цих значень false
є хорошим вибором, оскільки це запобігає непотрібній обробці та запитам бази даних, якщо вони не потрібні, а кеш все одно оновлюється, коли вперше потрібні спеціальні умови поля / систематики.
Однак якщо ви збираєтесь зателефонувати навіть один раз get_post_meta()
під час циклу, і ви збираєтесь зателефонувати get_the_terms()
за всіма (або більшістю) таксономіями, підтримуваними повідомленнями, то оновлення кешу все одно запускається, і фактична вигода може не мати встановлення цих аргументів запиту на false
.
wp_reset_postdata()
є скиданняglobal $post
та скидання об’єктного кешу? Це звучить так, якби я зробив спеціальний WP_Query, він створив би новий кешований об’єкт, але для його скидання також доведеться запитувати, щоб отримати оригінальний кеш. А може, я занадто далеко виходжу в контексті цього питання.