Меню

Ajax heartbeat tool настройка



Уменьшаем количества обращений к серверу с помощью Heartbeat Control

Создать данный пост меня заставила проблема, которая все настойчивее стала стучаться на мой сайт. Проблема — открытие страниц сайта и работа в админпанели. Они стали настолько сильны и часты, что стало затруднительным составить даже небобольшое сообщение. Соединение с сервером постоянно пропадало. Высокая нагрузка на CPU, а значит превышение так называемого мягкого лимита происходила постоянно; на почту очень часто стали проиходить сообщения от Метрики и плагина Jetpack, о том что сайт часто бывает недоступен, даже в тот момент, когда я в нем не работал. Короче — ужас ужасный снова настиг меня на проблеме скорости работы сайта. И я снова обратился в службу подержки на своем хостинге «Джино»

Ответ пришел незамедлительно, а при дальнейшем диалоге с небольшими пояснениями, я понял суть проблем и смог их исправить.

Поддержка хостинга прежде всего обратила мое внимание на большое количество обращений к /wp-admin/admin-ajax.php. «Обращения создают действия в административной панели сайта. Такое поведение в ней характерно, если какой-то из плагинов работает не корректно. Отключайте плагины сайта по очереди и следите за его работой. Обнаружив проблемный плагин, попробуйте его обновить или установить стабильную версию, или замените аналогом, с которым не возникает проблем».

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

Служба техподдержки так же обратила на еще одну проблему и предложила провести некоторые действия в коррекции кода в файле wp-cron.php. Но об этой проблеме в конце сообшения.

Ну а теперь давайте перейдем к сути вышесказанного.

Что такое Heartbeat API на WordPress и как его ограничить

Слово «Heartbeat» переводится как «Сердцебиение» и назван он так для API не зря. Она обеспечивает определенную частоту запросов к серверу. По умолчанию и в зависимости от страницы админпанели, это происходит с разными интервалами: при редактировании записей — каждые 15 сек, при работе в Консоли — одну минуту. WordPress Heartbeat API — это функция, которая обеспечивает:

  • Автосохранение при создании сообщений;
  • Блокировки записей или страниц для других редакторов сайта, пока запись или страницу редактирует один человек;
  • Обновление информации о том, что пользователь всё ещё находится в административной части (консоли или на странице редакции записей).

Данная функция, прописанная в движке WordPres очень важна, особенно тогда, когда на сайте могут работать несколько авторов и администрирование бывает коллективным. Однако она же может стать причиной «торможения» сайта и значительного увеличения нагрузки на сервер.

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

Полное отключение Heartbeat API

Этот жесткий сценарий, который я не пожелал сделать, заключается в том, что нужно проделать некоторую операцию в файле functions.php вашей темы, установленной в данный момент на сайте.

Как рекомендуют некоторые вебмастера, в самом начале этого файла, после тега Плагин Heartbeat Control и его настройки

Настроек всего и две и, несмотря на то, что плагин на английском, для незнающих этот язык, не трудно будет в них разобраться. Напомню, что настройка плагина по умолчанию (use default) означает, что Heartbeat API не отключен ни на одной из страниц, а интервал запросов к серверу — 15 сек. То есть все выглядет так, словно этого плагина на вашем сайте нет.

4. Использование настроек для страниц админпанели

Для ясности делаю пояснения:

Читайте также:  Стол для настройки баяна

1. use default — использовать Heartbeat API по умолчанию;
2. disable everywhere — отключить Heartbeat API везде;
3. disable on dashboard page — отключить Heartbeat API на приборной страницe (консоль);
4. allow onli от post edit pages — использовать Heartbeat API только при редактировании страниц.

2. Корретировка частоты запросов к серверу

Тут все очень просто. Нужно лишь выбрать подходящий интервал запросов к северу. Чем реже «пульс» — тем реже запросы — тем меньше нагрузка на сервер.

После совершения настроек сохраняем измения.

Поскольку автоматическое сохрание сохрание записей во время их редактирования остается желанной функцией (удалить лишние редакции можно потом чисткой специальными плагинами), а потерять почти завершенную запись по каким-либо техническим причинам неприятно (пропал интернет или связь с сервером и т. п.) очень нежелательно. Поэтому настройку для перврого блока вполе можно установить в режим «use default» но вполне достаточно будет сделать настройки во втором блоке, так как установка таймера частоты запросов к файлу admin-ajax.php. в 60 сек. сократит расход ресурсов на данные запросы на целых 75%!

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

В начале статьи я упомянул о том, что работники поддержки обратили мое внимание еще на одну причину сложности в работе моих сайтов. Причина —

Источник

Heartbeat API

Heartbeat API — это легкий способ периодически (каждые 15-120 секунд) опрашивать сервер на предмет новых данных и затем использовать их на стороне клиента (браузера).

Heartbeat API был добавлен в WordPress 3.6 и по началу был нужен для двух вещей:

  • Предупреждать пользователя о том, что пост редактируется кем-то другим в данный момент.
  • Проверять, не истекла ли сессия авторизации и запуск popup-окна с просьбой авторизоваться повторно.

Со временем этим механизмом стали пользоваться темы и плагины.

Heartbeat API по умолчанию работает только в админ-панели, но его легко можно использовать и во фронте.

Heartbeat API работает на основе классического AJAX в WordPress.

После загрузки страницы специальный JavaScript код (heartbeat код) запускает таймер. Через равные промежутки времени срабатывает JS событие heartbeat-send и запускаются подцепленные на это событие JS функции.

JS функции формируют и отсылают данные в файл admin-ajax.php . В этом файле срабатывает WP хук:

  • wp_ajax_heartbeat — если авторизован
  • wp_ajax_nopriv_heartbeat — если не авторизован

На оба эти хука по умолчанию подцеплены одноименные функции: wp_ajax_heartbeat() и wp_ajax_nopriv_heartbeat() . Таким образом, при хартбит запросе в PHP срабатывает одна из функций:

Далее функция вызывает три хука, через которые по сути и нужно работать с Хартбит:

Если не авторизован:

$screen_id будет равен front для фронтенда.

После срабатывания всех вышеописанных хуков PHP возвращает обратно пользователю (в браузер) данные (переменная $response ) в формате JSON.

При получении данных в JS срабатывает событие heartbeat-tick.

На основе присланных данных производится та или иная работа: предложение авторизоваться снова, сообщения от клиента менеджеру, сообщения из чата Telegram, извещение о новых комментариях и так далее.

Использование Heartbeat API

Heartbeat API по умолчанию доступен только в админке. Чтобы использовать этот механизм во фронте (лицевой части), надо подключить скрипт heartbeat.js или же указать его в зависимостях в своём скрипте.

Далее для использования Heartbeat API, нужно пройти три этапа. Не важно, делается это для фронта или админки.

1. Отправка данных на сервер

JS cобытие heartbeat-send срабатывает перед отправкой данных на сервер и это самый удачный момент добавить свои данные в коллекцию данных Heartbeat.

Читайте также:  Настройка usb порт virtualbox

В дефолтной сборке WordPress во вкладке браузера можно увидеть при ajax запросе нечто подобное:

Добавим в эту коллекцию свои данные:

По правилам хорошего тона JS код надо размещать в файле и подключать на хуке admin_enqueue_scripts (если речь идет об админке), но для упрощения примера выведем его на хуке admin_print_footer_scripts

Во вкладке браузера можно посмотреть, как данные отправились:

В примере была отправлена просто строка some_data , но отправлять можно любые данные: числа, массивы, объекты и т.д.

2. Прием данных на сервере и ответ

Прежде всего давайте посмотрим, что по умолчанию возвращает сервер:

На хуке heartbeat_received можно дополнить массив, которые формируют ядро/плагины/тема, своими данными:

Теперь сервер вернет следующий набор данных:

3. Обработка ответа сервера

После того, как сервер вернул объект с данными, обработаем их:

Мы рассмотрели три этапа, но не каждая задача нуждается в первом или третьем этапе.

PHP функционал сосредоточен в файле ajax-actions.php.

Эту функцию не нужно использовать, она автоматом вызывается в файле admin-ajax.php через ajax хуки. Она и проверяет запрос и вызывает хуки связанные с хартбит: heartbeat_send , heartbeat_tick .

Другими словами функция обрабатывает Heartbeat запросы от зарегистрированных пользователей. Прежде чем обработать запрос, проверяет наличие nonce кода. Если его нет — прерывает работу и возвращает ошибку. Если срок действия nonce кода истёк — возвращает информацию об этом и на странице появляется всплывающее окно с просьбой авторизоваться. Также в ответ добавляет время сервера функцией time() .

Свой функционал можно добавить через фильтры и события. См. ниже.

Фильтрует полученные данные heartbeat. Срабатывает, если есть данные в $data .

$response(массив) Данные для ответа Heartbeat. $data(массив) Присланные данные в массиве $_POST . $screen_id(строка) ID экрана. В php совпадает с $current_screen->id и c глобальным pagenow в JS.

Пример

Фильтрует данные ответа Heartbeat.

$response(массив) Данные для ответа Heartbeat. $screen_id(строка) ID экрана.

Пример из ядра WordPress

В ответ heartbeat добавляется информация о статусе авторизации пользователя.

Простой пример:

Добавим в ответ heartbeat информацию о количестве непроверенных комментариев.

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

Срабатывает после формирования heartbeat данных, но перед тем, как сервер отдаст их клиенту.

$response(массив) Данные для ответа Heartbeat. $screen_id(строка) ID экрана.

Пример

Если пришли какие-то определенные данные, известить администратора письмом.

Позволяет изменить опции в JS объекте wp.heartbeat.settings .

Для взаимодействия с неавторизованными пользователями во фронте, вместо функции wp_ajax_heartbeat() срабатывает функция wp_ajax_nopriv_heartbeat() . Она отличает от первой лишь тем, что не проверяет nonce код и статус авторизации, а также в её состав входят хуки с другими именами, но аналогичным поведением:

JavaScript и jQuery

JavaScript функционал сосредоточен в файле heartbeat.js.

На этом событии можно добавить свои данные в коллекцию heartbeat перед отправкой их на сервер.

Срабатывает каждый раз, когда от сервера приходят heartbeat данные. На этом событии оперируем с присланными данными.

Также можно отследить событие для нужного ответа по метке данных:

Срабатывает каждый раз, когда запрос к серверу был провален, то есть сработало $.ajax().fail() . На этом событии можно отследить, какая именно произошла ошибка и сделать что-либо по необходимости.

Heartbeat API имеет в составе ещё несколько событий, но они используются при разработке крайне редко:

  • heartbeat-connection-lost
  • heartbeat-connection-restored
  • heartbeat-nonces-expired

JavaScript объект wp.heartbeat

Работа с событиями напрямую не единственный способ взаимодействовать с Heartbeat API. Дело в том, что сердцем механизма является класс Heartbeat() , экземпляр которого помещен в переменную window.wp.heartbeat и доступен для разработчиков при написании JavaScript кода.

Читайте также:  Настройка asrock z77 pro3

Рассмотрим методы этого класса.

Добавляет данные в очередь для отправки в следующем XHR. Поскольку данные отправляются асинхронно, то эта функция не возвращает ответ XHR. Увидеть ответ можно на событии heartbeat-tick . Если одна и та же метка используется несколько раз, данные не перезаписываются, когда третий аргумент noOverwrite имеет значение true . Используйте wp.heartbeat.isQueued(‘handle’) , чтобы увидеть, были ли какие-либо данные уже поставлены в очередь для этой метки.

Возвращает true , если данные были поставлены в очередь и false , если нет.

Возвращает данные, стоящие в очереди, по их метке (Handle).

handle(строка) Уникальная метка (дескриптор) отправляемых данных.

Проверяет, находятся ли данные с определенной меткой в очереди.

handle(строка) Уникальная метка (дескриптор) отправляемых данных.

Возвращает true , если данные есть в очереди и false , если нет.

Удаляет из очереди данные по их метке (handle).

handle (строка) Уникальная метка (дескриптор) отправляемых данных.

Устанавливает или возвращает интервал опроса сервера в секундах.

speed(строка/число) Скорость опроса в секундах. Может быть ‘fast’ или 5, 15, 30, 60, 120, ‘long-polling’ (экспериментально). Если окно не в фокусе, интервал замедляется до 2 минут. Если количество секунд передаётся как число, то тип должен быть именно числом, а не строкой.
По умолчанию: 60 ticks(число) Данный аргумент применяется, если аргумент speed равен ‘fast’ или 5 . Позволяет указать сколько раз посылать запросы с этим интервалом. Можно указать не более 30, то есть максимум каждые 5 секунд сервер будет опрашиваться в течение 2 минут 30 секунд. После этого speed возвращается к значению по умолчанию, то есть 60 секунд.
По умолчанию: 30

Пример передачи переменной в качестве числа:

Проверяет имеет ли окно (или любой локальный iframe в нем) фокус или активен ли пользователь. Возвращает true или false. Обращается к свойству settings.hasFocus . Работает на основе нативного document.hasFocus() (если доступен и обновляет settings.hasFocus по таймеру каждые 10 секунд). Если нужно проверять фокус чаще, чем каждые 10 секунд, используйте document.hasFocus() .

Ниже код каждые 5 секунд будет проверять, активна ли вкладка в браузере, где используется heartbeat, и выводить в консоль браузера соответствующее сообщение.

Отключает приостановку. Следует использовать только в том случае, когда heartbeat выполняет такие важные задачи, как автосохранение, пост-блокировка и т.д. Использование этого функционала на многих экранах может привести к перегрузке учетной записи хостинга пользователя, если несколько окон/вкладок браузера остаются открытыми в течение длительного времени.

Сразу отправляет heartbeat запрос вне зависимости от состояния hasFocus . Не будет открывать два одновременных соединения. Если подключение выполняется, будет подключен снова сразу после завершения текущего подключения. Особенно удобен при тестировании heartbeat функционала, так как можно сделать запрос сразу, в том числе и из консоли браузера.

Проверяет, существует ли ошибка подключения.

Нет ничего лучше, чем примеры в виде реальных плагинов, которые всегда можно найти в репозитории WordPress.

Слежение за комментариями в админке

Данный плагин, как пример, при heartbeat запросе собирает данные о комментариях, ожидающих модерации, и обновляет счётчики в сайдбаре и админбаре. Срабатывает, как в админке, так и во фронте. И только у тех пользователей, у которых есть права модерировать комментарии.

Состоит из двух файлов.

admin-comment-notice.php

scripts.js

В WordPress по умолчанию

После отправки Хартбит запроса, WP обрабатывает по умолчанию всего несколько операций. Чтобы узнать какие, посмотрим, что прикрепляется к хукам: heartbeat_received , heartbeat_send и heartbeat_tick . Т.е. как ВП меняет ответ сервера.

heartbeat_received
heartbeat_send
heartbeat_tick

Ничего не прикрепляется по умолчанию.

Базовый настройки Хартбит, устанавливаются через фильтр:

При создании статьи использовались материалы:

Источник

Adblock
detector