Кэш объектов везде
WordPress старается максимально сократить количество запросов к базе данных.
Например, всякий раз, когда вы получаете мета-поле или поле таксономии, перед запросом к базе данных WordPress проверяет, было ли это уже запрошено и сохранено в кеше, и возвращает его оттуда вместо запроса к базе данных.
«Кэширование» выполняется с помощью WP_Object_Cache
класса и wp_cache_*
функций (которые являются оберткой для методов этого класса.)
Где живет кеш
По умолчанию «кеш» - это не более чем глобальная переменная PHP. Это означает, что он находится в памяти, но также означает, что он исчезает при каждом запросе.
Тем не менее, через dropins ( advanced-cache.php
и / или object-cache.php
), можно настроить собственный способ обработки этого кэша.
Обычно эти dropins используются для установки какого-то механизма кэширования, который «выживает» в единичных запросах.
По этой причине среди разработчиков 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);
Приведенные выше 2 строки кода инициируют, как правило, 1 запрос к базе данных.
Фактически, когда вы запрашиваете пользовательское поле, все поля для этого сообщения извлекаются из базы данных, кэшируются через кеш объекта, а последующие запросы извлекают данные из кеша, а не из базы данных.
То же самое происходит с терминами таксономии, 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 выполняет только один запрос БД в каждой функции, но также выполняет большую обработку. Например, 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, он бы создал новый кешированный объект, но для его сброса также потребовался бы запрос, чтобы получить исходный кеш. Или, может быть, я слишком далеко в контексте этого вопроса.