Кэш объектов везде
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, он бы создал новый кешированный объект, но для его сброса также потребовался бы запрос, чтобы получить исходный кеш. Или, может быть, я слишком далеко в контексте этого вопроса.wp_reset_postdata()
что ничего не делать в отношении объектного кэша.wp_reset_postdata()
только сбросить глобальный объект post, то есть еще одну глобальную переменную, которая никогда не кэшируется ... Переходные процессы - это гибридная вещь: если у вас установлен какой-либо постоянный плагин кеша, используйте переходный процесс, но если у вас нет постоянного модуля кеша, то переходные процессы использовать базу данных.global variable
идею и предположил, что это былиglobal $post
или глобальные$wp_query
объекты, спасибо за разъяснение!fields => 'ids'
устанавливает оба кэшей вfalse
. Я полагаю, что имеет смысл, что кэш объектов работает только на объектах, но я подумал, что просто упомяну: DГлавной достопримечательностью здесь является
update_post_caches
функция. Он вызывается после того, как WP_Query получил все сообщения из БД. Обычно причина, по которой вы хотите, чтобы посты были в первую очередь, заключается в том, чтобы отображать их, что обычно означает отображение терминов и чего-либо на основе метаданных, поэтому WP_Query также по умолчанию запрашивает в БД мета-данные и данные терминов, относящиеся к возвращаемым постам и хранит его в кеше *. Эта информация явно недоступна в данных, возвращаемых из WP_Query, но когда вы вызовете соответствующие API для получения термина и метаинформации определенного поста, она уже будет доступна в памяти и не будет необходимости отправлять новый запрос в БД.Это позволяет WordPress уменьшить накладные расходы, связанные с отправкой запросов в БД, отправляя только один запрос для получения информации для всех сообщений вместо отправки запроса для каждого сообщения.
Прямо сейчас я не могу найти ни одного нетривиального примера того, когда вы не хотите обновлять кеш, но тривиальным может быть, если вы просто хотите получить список заголовков всех сообщений. Для этого вам не нужны термин или метаданные.
* cache - наиболее важным здесь является кэш на основе памяти, в котором WP хранит почти все, что получает от БД, даже без использования какого-либо активного плагина кэширования объектов. Очевидно, что когда у вас есть объектное кэширование, информация также будет храниться там.
источник