Java, UX, HTML, CSS, WEB-design

Методы кэширования своими руками с помощью WordPress

[ad_1]

  • Милан Петрович

  • 0 Комментарии

Методы кэширования своими руками с помощью WordPress

  • 10 минут чтения

  • WordPress, Техники

Краткое резюме ↬

Существуют различные способы сделать ваш веб-сайт быстрее: специализированные плагины для кэширования полных визуализированных HTML-страниц, плагины для кэширования всех SQL-запросов и объектов данных, плагины для минимизации файлов JavaScript и CSS и даже некоторые серверные решения.

Но даже если вы используете такие плагины, использование внутренних методов кэширования для объектов и результатов базы данных является хорошей практикой разработки, чтобы ваш плагин не зависел от того, какие плагины кэширования есть у конечного пользователя. Ваш плагин должен быть быстрым сам по себе, а не зависеть от других плагинов, выполняющих грязную работу. И если вы думаете, что вам нужно написать собственный код обработки кеша, вы ошибаетесь. WordPress поставляется со всем необходимым для быстрой реализации различных степеней кэширования данных. Просто определите части своего кода, которые нужно оптимизировать, и выберите тип кэширования.

Дальнейшее чтение на SmashingMag:

  • Изменение списков сообщений администратора в WordPress
  • Полезные бесплатные плагины администратора для WordPress
  • Десять вещей, которые должен знать каждый разработчик плагинов для WordPress
  • Внутри панели инструментов WordPress

WordPress реализует два разных метода кэширования:

Еще после прыжка! Продолжить чтение ниже ↓
  1. непостоянный Данные остаются в кеше во время загрузки страницы. (WordPress использует это для кэширования большинства результатов запросов к базе данных.)
  2. Настойчивый Это зависит от работы базы данных, и кешированные данные могут автоматически истечь через некоторое время. (WordPress использует это для кэширования RSS-каналов, проверки обновлений и т. д.)

Непостоянный кэш

При использовании таких функций, как get_posts() или get_post_meta(), WordPress сначала проверяет, кэшируются ли нужные вам данные. Если да, то вы получите данные из кеша; если нет, то выполняется запрос к базе данных для получения данных. После извлечения данных они также кэшируются. Непостоянный кэш рекомендуется для результатов базы данных, которые могут быть повторно использованы при создании страницы.

Код внутреннего непостоянного кеша WordPress находится в папке cache.php файл в wp-includes каталог, и он обрабатывается WP_Object_Cache сорт. Нам нужно использовать две основные функции: wp_cache_set() а также wp_cache_get()а также дополнительные функции wp_cache_add(), wp_cache_replace(), wp_cache_flush() а также wp_cache_delete(). Кэшированное хранилище организовано по группам, и для каждой записи нужен свой уникальный ключ. Чтобы избежать смешивания с данными WordPress по умолчанию, лучше всего использовать собственные уникальные имена групп.

Пример

В этом примере мы создадим функцию с именем d4p_get_all_post_meta(), который извлечет все метаданные, связанные с публикацией. Эта первая версия не включает кэширование.

function d4p_get_all_post_meta($post_id) {
    global $wpdb;

    $data = array();
    $raw = $wpdb->get_results( "SELECT meta_key, meta_value FROM $wpdb->postmeta WHERE post_id = $post_id", ARRAY_A );

    foreach ( $raw as $row ) {
        $data[$row['meta_key']][] = $row['meta_value'];
    }

    return $data;
}

Каждый раз, когда вы вызываете эту функцию для одного и того же идентификатора сообщения, будет выполняться запрос SQL. Вот модифицированная функция, которая использует непостоянный кеш WordPress:

function d4p_get_all_post_meta($post_id) {
    global $wpdb;

    if ( ! $data = wp_cache_get( $post_id, 'd4p_post_meta' ) ) {
        $data = array();
        $raw = $wpdb->get_results( "SELECT meta_key, meta_value FROM $wpdb->postmeta WHERE post_id = $post_id", ARRAY_A );

        foreach ( $raw as $row ) {
            $data[$row['meta_key']][] = $row['meta_value'];
        }

        wp_cache_add( $post_id, $data, 'd4p_post_meta' );
    }

    return $data;
}

Здесь мы используем группу кеша с именем d4p_post_metaа также post_id это ключ. С помощью этой функции мы сначала проверяем, нужны ли нам какие-либо данные из кеша (строка 4). Если нет, мы запускаем обычный код для получения данных, а затем добавляем их в кэш в строке 13. Таким образом, если вы вызываете эту функцию более одного раза, только первый вызов будет выполнять SQL-запросы; все остальные вызовы будут получать данные из кеша. Мы используем wp_cache_add функция здесь, поэтому, если комбинация клавиш и групп уже существует в магазине, она не будет заменена. Сравните это с wp_cache_setкоторый всегда будет перезаписывать существующее значение без проверки.

Как видите, мы внесли лишь небольшое изменение в существующий код, но потенциально сэкономили много повторных обращений к базе данных во время загрузки страницы.

Важные заметки

  1. Непостоянный кеш доступен только во время загрузки текущей страницы; как только загрузится следующая страница, она снова будет пустой.
  2. Размер хранилища ограничен общей доступной памятью для PHP на сервере. Не храните большие наборы данных, иначе вы можете получить сообщение «Недостаточно памяти».
  3. Использование этого типа кеша имеет смысл только для операций, повторяющихся более одного раза при создании страницы.
  4. Он работает с WordPress с версии 2.0.

Временно постоянный кэш, управляемый базой данных

Этот тип кеша основан на встроенной в WordPress функции, которая называется Transient API. Переходные процессы хранятся в базе данных (аналогично большинству настроек WordPress, в wp_options стол). Для переходных процессов требуется две записи в базе данных: одна для хранения времени истечения срока действия и одна для хранения данных. Когда запрашиваются кешированные данные, WordPress проверяет отметку времени и выполняет одно из двух действий. Если время истечения истекло, WordPress удаляет данные и возвращает false как результат. Если срок действия данных не истек, выполняется другой запрос для их извлечения. Преимущество этого метода в том, что кеш сохраняется даже после загрузки страницы, и его можно использовать для других страниц до тех пор, пока не истек срок действия переходного процесса.

Если ваши запросы к базе данных сложны и/или выдают результаты, которые могут меняться нечасто, хорошей идеей будет их хранение во временном кеше. Это отличное решение для большинства виджетов, меню и других элементов страницы.

Пример

Допустим, мы хотели, чтобы SQL-запрос извлек 20 сообщений за предыдущий месяц вместе с некоторыми основными данными об авторе, такими как имя, адрес электронной почты и URL-адрес. Но нам нужны сообщения только от 10 лучших авторов (отсортированных по общему количеству сообщений в этом месяце). Результаты будут отображаться в виджете.

При тестировании на моей локальной машине этот SQL-запрос выполнялся за 0,1710 секунды. Если бы у нас было 1000 просмотров страниц в день, этот запрос занимал бы 171 секунду каждые 24 часа или 5130 секунд в месяц. Условно говоря, это не так много времени, но мы могли бы добиться большего успеха, используя временный кеш для хранения этих результатов со сроком действия 30 дней. Поскольку результаты этого запроса не изменятся в течение месяца, временный кэш — отличный способ оптимизировать ресурсы.

Возвращаясь к моей локальной машине, улучшенный SQL-запрос для получения данных из временного кеша теперь составляет всего 0,0006 секунды, или 18 секунд в месяц. Преимущество этого метода в этом случае очевидно: мы экономим 85 минут каждый месяц с помощью одного этого виджета. Совсем неплохо. Есть случаи, когда вы могли бы сэкономить гораздо больше (например, с очень сложными меню). Более сложные SQL-запросы или операции еще больше оптимизируют ресурсы.

Давайте посмотрим на реальный код до и после реализации временного кеша. Ниже приведена обычная функция для получения данных. В этом примере SQL-запрос пуст (потому что он длинный и занял бы здесь слишком много места), но ссылка на весь виджет приведена в конце этой статьи.

function d4p_get_query_results() {
    global $wpdb;

    $data = $wpdb->get_results(' // SQL query // ');

    return $data;
}

А вот функция, использующая временный кеш, с несколькими дополнительными строками для проверки кэширования данных.

function d4p_get_query_results() {
    global $wpdb;

    $data = get_transient('my_transient_key');

    if ($data === false) {
        $data = $wpdb->get_results(' // SQL query // ');
        set_transient('my_transient_key', $data, 3600 * 24);
    }

    return $data;
}

Функция get_transient (или get_site_transient для сети) необходимо имя временного ключа записи. Если ключ не найден или запись просрочена, то функция вернет false. Чтобы добавить новую запись временного кэша, вам понадобится ключ записи, объект с данными и время истечения срока действия (в секундах), и вам нужно будет использовать set_transient функция (или set_site_transient для сети).

Если ваши данные изменятся, вы можете удалить их из кеша. Вам понадобится ключ записи и delete_transient функция (или delete_site_transient для сети). В этом примере, если сообщение в кеше удалено или каким-либо образом изменено, вы можете удалить запись кеша следующим образом:

delete_transient('my_transient_key');

Важные заметки

  1. Теоретический максимальный размер данных, которые вы можете хранить таким образом, составляет 4 ГБ. Но обычно вы храните гораздо меньшие объемы данных в переходном режиме (до пары МБ).
  2. Используйте этот метод только для данных (или операций), которые не изменяются часто, и установите время истечения срока действия в соответствии с циклом изменения данных.
  3. По сути, вы используете его для рендеринга результатов, сгенерированных посредством серии запросов к базе данных, и сохранения полученного HTML-кода в кэше.
  4. Имя переходной записи не может быть длиннее 45 символов или 40 символов для «переходных элементов сайта» (используется с несколькими сайтами для хранения данных на сетевом уровне).
  5. Он работает с WordPress с версии 3.0.

Пример виджета: использование обоих типов кэша

На основе нашего SQL-запроса мы можем создать виджет, который использует оба метода кэширования. Это два подхода к проблеме, и два виджета будут производить по существу один и тот же результат, но используя разные методы для извлечения данных и кэширования результатов. Как администратор, вы можете установить заголовок для виджета и количество дней, в течение которых результаты будут храниться в кеше.

Обе версии просты и могут быть улучшены (например, путем выбора типа сообщения или форматирования вывода), но для этой статьи их достаточно.

Необработанный виджет

«Сырая» версия виджета хранит объект с результатами SQL-запроса в транзиентном кеше. В этом случае запрос SQL вернет все столбцы из wp_posts таблицу и некоторые столбцы из wp_users таблица вместе с информацией об авторах. Каждый раз, когда виджет загружается, каждое сообщение из нашего набора результатов будет сохраняться в объекте непостоянного кеша в стандартном posts group, которая используется для хранения сообщений для обычных операций WordPress. Благодаря этому такие функции, как get_permalink() может использовать кэшированный объект для создания URL-адреса для публикации. Информация об авторах из wp_users таблица используется для генерации URL-адреса архива сообщений авторов.

Этот виджет находится в method_raw.php файл в d4p_sa_method_raw сорт. Функция get_data() является наиболее важной частью виджета. Он пытается получить данные из временного кеша (строка 52). Если это не удастся, get_data_real() вызывается для выполнения SQL-запроса и возврата данных. Эти данные теперь сохраняются во временном кеше (строка 56). После того, как у нас есть данные, мы сохраняем каждый пост из набора в непостоянный кеш. То render функция проста; он отображает результаты в виде неупорядоченного списка.

Визуализированный виджет

Предыдущий метод работает хорошо, но может иметь одну проблему. Что, если ваша постоянная ссылка зависит от категорий (или других таксономий) или вы выполняете запрос для типа сообщения в иерархии? Если это так, то для создания постоянной ссылки для каждого сообщения потребуются дополнительные SQL-запросы. Например, чтобы отобразить 20 сообщений, вам может понадобиться еще 20 или более SQL-запросов. Чтобы решить эту проблему, мы изменим способ получения данных и то, что хранится во временном кеше.

Второй виджет находится в method_rendered.php файл в d4p_sa_method_rendered сорт. Внутри имена методов класса одинаковы, поэтому теперь вы можете легко увидеть разницу между двумя виджетами. В этом случае временный кэш используется в render() метод. Мы проверяем кэшированные данные, и если это не удается, мы используем get_data() чтобы получить набор данных и сгенерировать отображаемый список результатов. Теперь мы кэшируем визуализированный вывод HTML! Независимо от того, сколько дополнительных SQL-запросов требуется для генерации HTML (постоянные ссылки или что-то еще, что вам может понадобиться в виджете), они выполняются только один раз, и весь HTML кэшируется. Пока срок действия кеша не истечет, мы всегда отображаем HTML, обработанный без необходимости каких-либо дополнительных SQL-запросов или обработки.

Скачать виджет

Вы можете скачать этот плагин D4P Smashing Authors, который содержит оба виджета.

Заключение

Как видите, реализация одного или обоих методов кэширования проста и может значительно повысить производительность вашего плагина. Если пользователь вашего плагина решит использовать специализированный кеширующий плагин, тем лучше, но убедитесь, что ваш код оптимизирован.

Сокрушительная редакция
(аль)



[ad_2]
Source: https://smashingmagazine.com

Заключение

Вы ознакомились с статьей — Методы кэширования своими руками с помощью WordPress

Пожалуйста оцените статью, и напишите комментарий.

Похожие статьи

Добавить комментарий

Ваш адрес email не будет опубликован.

Краткое описание по статье Методы кэширования своими руками с помощью WordPress

Название: Методы кэширования своими руками с помощью WordPress . Краткое описание: [ad_1] ⭐ Милан П . Дата публикации: 17.02.2022 . Автор: Алишер Валеев .

Для чего создан сайт Novosti-Nedeli.ru

Данный сайт посвящен новостям мира и мира технологий . Также тут вы найдете руководства по различным девайсам.

Сколько лет сайту?

Возраст составляет 3 года

Кнопка «Наверх»