Что такое Transients API?
Опубликовано: 2020-12-16Производительность веб-сайта часто вращается вокруг идеи кеширования: хранения данных в готовом и быстром доступном состоянии, чтобы они быстрее воспроизводились браузерами. WordPress Transients API - это инструмент для кэширования и мощный способ повысить производительность веб-сайтов WordPress.
Что такое кеширование и зачем его использовать?
Каждый раз, когда браузер запрашивает веб-страницу, обслуживающий сервер должен выполнять множество сложных и длительных вычислений, что приводит к задержкам. После выполнения запроса, благодаря технологии кэширования, сервер может запомнить конечный результат и после второго запроса предоставить его браузеру без необходимости повторять те же вычисления снова. Следовательно, возможность кэширования и повторного использования более ранних ресурсов имеет решающее значение для оптимизации производительности.
Очень просто кэширование дает возможность временно хранить информацию на уровне кэширования.
Какие бывают типы кеширования?
Существуют разные типы кэширования, и, используя их комбинацию, вы достигнете более высокого уровня производительности.
Кеширование браузера
Перед открытием содержимого веб-страницы вашему браузеру требуется множество вещей, таких как файлы JavaScript, таблицы стилей, шрифты и т. Д., Которые он загружает в дополнение к содержимому страницы.
Если браузер кэширует эти файлы, вам не нужно будет загружать их каждый раз при загрузке веб-сайта. Первая загрузка сайта обычно занимает несколько секунд, но после того, как браузер кэширует эти файлы, время загрузки значительно сокращается.
Кеширование сервера
Кэширование сервера означает сохранение HTML-файла для конкретной страницы и использование if для каждого последующего запроса. Это так называемый полностраничный кеш.
Существует еще один тип серверного кеша - объектный кеш, который, в отличие от полностраничного кеша, кэширует только определенные биты (части) информации.
Кэширование страницы
Считается самым эффективным кешем. Его название говорит само за себя, так как он работает. Когда пользователь «А» посещает страницу, веб-сайт создает ее и возвращает содержимое в браузер пользователя. При работающем кэше страниц содержимое этой страницы сохраняется, поэтому, когда пользователь «Б» посещает ту же страницу, кеш страницы воспроизводит ранее отправленное содержимое.
Самым большим преимуществом Page Cache является то, что кешированная страница возвращается почти в момент доступа. В результате обрабатываются миллионы запросов и воспроизводятся страницы даже на самом слабом сервере с самой низкой скоростью памяти и небольшой загрузкой ЦП.
Но у этого типа кеша есть и свои недостатки: например, невозможность кэшировать страницы для авторизованного пользователя или для пользователя, содержимое страницы которого зависит от текущих пользовательских переменных.
Кэширование базы данных
Кэширование базы данных - это процесс, включенный в разработку компьютерных приложений, которые генерируют веб-страницы по запросу (динамически) путем доступа к внутренним базам данных. Кэш базы данных улучшает вашу первичную базу данных, устраняя ненужное давление на нее, обычно в форме часто используемых данных чтения. Сам кеш может работать в нескольких областях, включая вашу базу данных, приложение или как автономный уровень.
Когда эти приложения развертываются в многоуровневых средах, которые включают клиентов на основе браузера, серверы веб-приложений и внутренние базы данных, для достижения высокой масштабируемости и производительности используется кэширование базы данных среднего уровня.
Кэширование объектов
Кэширование объектов в WordPress (объектный кеш) предполагает хранение запросов к базе данных. Это встроенный в систему механизм, который позволяет сохранять данные (объекты) любого типа и при необходимости извлекать их. Этот кеш используется для хранения результатов сложных операций.
Когда он включен на вашем сайте WordPress, он помогает ускорить выполнение PHP, быстрее доставлять контент посетителям сайта и снизить нагрузку на базу данных.
CDN (сети доставки контента)
Это географически распределенная сетевая инфраструктура, обеспечивающая быструю доставку контента пользователям веб-служб и сайтов. Серверы, включенные в CDN, географически расположены таким образом, чтобы время отклика пользователей сайта / сервиса было минимальным.
Что такое Transients API в WordPress?
Transients API - это способ хранения блока информации (строки кода, содержимого HTML, объектов WP_Query, JSON) в базе данных веб-сайта в отличие от кеширования браузера. Transients API очень похож на Options API, но главное отличие состоит в том, что Transients API имеет срок действия или, точнее, срок службы.
Три основных операции для переходных процессов - установка значений, получение значений и удаление значений :
1. Установите переходный процесс -
set_transient ($ ключ, $ значение, $ истекает);
Чтобы установить переходный процесс, вы можете использовать функцию set_transient (), которая имеет три компонента:
- Ключ - Краткое уникальное имя переходного процесса. Должно быть не более 172 символов.
- Значение - любой тип переменной PHP, которая содержит информацию, которая будет храниться в базе данных.
- Срок действия (срок действия) - время, в течение которого информация будет храниться.
Так, например, если мы хотим сохранить наш запрос сообщений о листинге на один день:
set_transient ('уникальный_список_постов_query_results_name',$list_posts_query_results, DAY_IN_SECONDS);
Как видите, мы использовали одну (DAY_IN_SECONDS) из нескольких постоянных времени, представленных в WordPress 3.5, чтобы легко выразить время. Вот полный список постоянных констант:
MINUTE_IN_SECONDS = 60 (секунд) HOUR_IN_SECONDS = 60 * MINUTE_IN_SECONDS DAY_IN_SECONDS = 24 * HOUR_IN_SECONDS WEEK_IN_SECONDS = 7 * DAY_IN_SECONDS MONTH_IN_SECONDS = 30 * DAY_IN_SECONDS YEAR_IN_SECONDS = 365 * DAY_IN_SECONDS
2. Получите переходный процесс -
get_transient ($ ключ);
Чтобы получить сохраненный переходный процесс, мы можем использовать
get_transient ($ transient_name);
В нашем случае мы могли бы получить результаты запроса со списком сообщений с помощью:
get_transient ( 'уникальный_список_постов_query_results_name' );
Мы увидим больше об этом позже в нашем разделе примеров.
3. Удалить переходный процесс -
delete_transient ($ ключ);
Как мы объяснили в предыдущих подразделах, мы можем использовать Transients API для получения и хранения удаленных или локальных (контент или запрос из нашей базы данных) ответов на нашу базу данных.
Однако здесь возникает вопрос, как мы удаляем старый сохраненный контент (временный). Есть два способа очистить (удалить) переходные процессы:
Автоматическое удаление
Самое замечательное в переходных процессах то, что они истекают автоматически, если мы устанавливаем время истечения (продолжительность жизни) . Если вы попытаетесь получить переходный процесс из своей базы данных после истечения срока его действия, WordPress автоматически удалит его, предотвращая беспорядок. Переходный процесс будет воссоздан, как только кто-нибудь откроет веб-сайт. Таким образом мы гарантируем, что у нас будет свежий контент из удаленного или локального API.
Ручное удаление
Иногда нам нужно заставить переходный процесс умереть раньше, удалив его вручную. Это полезно, когда данное действие (добавление нового пункта меню, сохранение или обновление сообщения, добавление или обновление категории и т. Д.) Делает кешированные данные по своей сути устаревшими и нуждающимися в обновлении:
Функция, которую мы должны использовать, это
delete_transient ($ transient_name)
а в нашем случае это должно быть:
delete_transient ( 'уникальный_список_постов_query_results_name' );
Примечание. Важно НЕ использовать переходные процессы для хранения ценных данных, которые невозможно воссоздать!
Почему мы должны использовать API переходных процессов?
Мы можем использовать Transients API всякий раз, когда у нас есть значение, требующее интенсивных вычислений, которое не меняется очень часто и которое вы хотите кэшировать. В WordPress это обычно будет объект, полученный в результате запроса к базе данных, но на самом деле это может быть все, что вы храните в переменной, будь то скалярное значение, массив или объект.
Так что в целом переходные процессы хороши, когда вы выполняете сложные запросы в своих темах и плагинах.
Преимущества кеширования удаленных или локальных ответов
Ответы удаленного API
Удаленные API-интерфейсы всегда выполняют несколько вызовов или запросов к удаленным серверам, и возникает некоторая дополнительная задержка. Это требует времени и вызывает задержки. Кроме того, некоторые удаленные API-интерфейсы могут иметь ограничения скорости, что означает, что вы можете достичь максимального лимита запросов в течение заданного периода времени.
И, как вы уже знаете, мы можем использовать Transients API для кэширования ответа (результата) с удаленного сервера и сохранения его в нашей базе данных. Теперь мы можем использовать
get_transient ();
метод и показывать сохраненный (кешированный) результат / контент везде, где это необходимо, без других удаленных вызовов или запросов.
Все это будет:
- Уменьшите количество удаленных вызовов и запросов HTTPS
- Уменьшите использование ЦП-сервера
- Улучшение времени загрузки страницы сайта
Ответы локального API
- в основном HTML или результаты запроса из базы данных. Вы можете использовать Transients API не только для кэширования удаленных ответов, но и для хранения содержимого HTML или результатов запросов в локальной базе данных. Это очень полезно, если вы хотите показать повторяемый HTML-раздел на своем веб-сайте (виджеты, слайдеры, меню и т. Д.) Или просто предотвратить запуск сложных или медленных запросов к базе данных каждый раз, когда кто-то посещает ваш сайт.
Где и когда использовать переходные процессы?
- Сложные и настраиваемые запросы к базе данных
- Меню навигации WordPress
- Виджеты боковой панели, отображающие такую информацию, как: твиты, список недавних посетителей сайта или список сообщений из определенной категории
- Кэширование облаков тегов
- Кеширование внешних HTTP-запросов
Использование и примеры
После стольких объяснений пришло время реальных примеров.
Основное использование
function get_my_data () { $ data = get_transient ('my_transient_name'); if (false === $ data) {// Срок действия истек / не установлен $ data = fetch_my_data (); // Извлекаем данные из исходного источника set_transient ('my_transient_name', $ data, HOUR_IN_SECONDS); } вернуть данные $; }
Функция fetch_my_data () может хранить объект WP_Query, данные json, содержимое html и т. д.
Базовый пример
Как мы уже объяснили, этот тип кэширования хорош для сохранения результатов длительных операций, и самый простой пример - это доступ к внешним API, таким как Facebook.
Представьте, что у нас есть следующая функция, которая обращается к API Facebook, запрашивает объект (точнее, страницу) your-website.url и возвращает количество лайков страницы:
function get_facebook_likes () { $ result = wp_remote_get ('https://graph.facebook.com/your-website.url'); $ result = json_decode (wp_remote_retrieve_body ($ result)); вернуть $ результат-> лайков; } echo «Facebook любит:». get_facebook_likes ();
Время выполнения этой функции зависит от многих факторов, включая расположение вашего сервера относительно серверов Facebook, состояние и скорость сети и т. Д. В среднем выполнение функции может занять 1-3 секунды.
Это означает, что при использовании данной функции на сайте время загрузки каждой страницы увеличится на 1-3 секунды. Более того, если мы вызовем эту функцию более 500 раз за 500 секунд, Facebook начнет генерировать ошибку вместо результата.
Чтобы ускорить эту функцию, мы можем использовать WordPress Transients API и сохранить результат в течение 1 часа:
function get_facebook_likes () { if (false === ($ like = get_transient ('fb_likes'))) { $ result = wp_remote_get ('https://graph.facebook.com/your-website.url'); $ result = json_decode (wp_remote_retrieve_body ($ result)); $ любит = $ результат-> лайков; // Устанавливаем переходный процесс на час в секундах set_transient ('fb_likes', $ like, 1 * HOUR_IN_SECONDS); } вернуть $ лайков; }
Таким образом, при первом вызове этой функции после получения запроса от Facebook WordPress запишет результат в базу данных и в будущем будет возвращать этот результат из базы данных в течение часа, не делая повторных запросов к серверу Facebook. И через час функция снова обратится к Facebook за данными.
При таком подходе только один вызов этой функции в час увеличит время запроса на 1-3 секунды, а последующие вызовы будут выполняться мгновенно.
Более сложный пример
Представьте, что у нас есть веб-сайт с примерно 100 категориями и примерно 50 000 публикаций, а в дизайне одного сообщения веб-сайта у нас есть виджет, который показывает N связанных сообщений из категории, в которой находится текущее сообщение. Как и ожидалось, этот сложный запрос займет некоторое время, чтобы получить результат из базы данных и отобразить его на веб-сайте.
А теперь представьте, что у вас есть 10 000 пользователей, которые одновременно заходят на сайт. Это означает, что у нас будет более 10 000 запросов к базе данных, которые должны выполнить запрос (это сложный запрос, поскольку он будет искать по таблицам wp_terms, wp_term_relationships, wp_term_taxonomy, wp_posts , поэтому их больше 10 000 запросов), чтобы получить результат для N сообщений из связанной категории и показать их во внешнем интерфейсе. Это, в свою очередь, приведет к перегрузке базы данных и задержке общего времени загрузки веб-сайта, а в некоторых случаях даже к сбою из-за перегрузки базы данных.
И здесь возникает вопрос, как мы можем оптимизировать и уменьшить количество запросов и запросов к базе данных. Почему так много запросов каждый раз, когда мы можем воспользоваться Transients API и просто кэшировать объект запроса или кэшировать весь вывод HTML? Таким образом мы уменьшим и оптимизируем количество запросов к базе данных, что приведет к повышению производительности веб-сайта и удобству работы пользователей.
В нашем случае запросы будут искать в таблицах wp_terms, wp_term_relationships, wp_term_taxonomy, wp_posts, чтобы получить все ожидаемые результаты.
Вот полный пример того, как мы можем этого добиться:
function show_posts_from_category () { $ args = массив ( 'cat' => 555, // Случайный ID категории 'posts_per_page' => 8, // Случайное количество связанных сообщений для отображения 'No_found_rows' => верно, ); $ hash = md5 ($ args ['кошка']); // MD5-хеш идентификатора категории $ transient_key = 'категория-'. $ hash; // Временный ключ if (false === ($ posts_from_category_html = get_transient ($ transient_key))): // Срок действия временного режима истек / не установлен $ the_query = новый WP_Query ($ args); // Получаем запрос ob_start (); // Включаем буферизацию вывода а ($ the_query-> have_posts ()): $ the_query-> the_post (); ?> <div class = "item"> <div class = "bigthumb"> <a href="<?php the_permalink();?> "rel =" bookmark "title =" <? php the_title ();?> "> <? php if (has_post_thumbnail ()) the_post_thumbnail ('big-thumb' ); ?> </a> </div> <h3> <a href="<?php the_permalink();?> "rel =" bookmark "title =" <? php the_title ();?> "> <? php the_title (); ?> </a> </h3> <? php the_excerpt (); ?> </div> <? php конец пока; $ post_from_category_html = ob_get_contents (); // Получает содержимое выходного буфера, не очищая его ob_end_clean (); // Отключает эту буферизацию вывода set_transient ($ transient_key, $ posts_from_category_html, $ transient_expire = 15 * MINUTE_IN_SECONDS); // Установка переходного процесса с истечением 15 минут wp_reset_postdata (); endif; return $ post_from_category_html; }
Последние мысли
Кеширование - отличный способ ускорить процесс, но вы должны точно знать, что вы кэшируете, где вы можете это сделать, когда и как, иначе вы рискуете столкнуться с неожиданными последствиями.
Если вы не уверены, работает ли что-то так, как задумано, всегда обращайтесь к профилированию - смотрите на каждый запрос к базе данных, смотрите на все вызовы функций PHP, время и использование памяти.
Transients API - отличный способ оптимизировать время загрузки вашего веб-сайта WordPress и обеспечить исключительный пользовательский интерфейс. Использовать переходные процессы в ваших плагинах и темах просто и добавить всего несколько дополнительных строк кода. При использовании в правильных ситуациях - таких как длинные запросы к базе данных или сложные обрабатываемые данные - он может сэкономить секунды на времени загрузки вашего сайта.