ГлавнаяРазноеКак отслеживать внешние HTTP запросы в WordPress

Как отслеживать внешние HTTP запросы в WordPress

Одна из самых распространенных причин медленных сайтов на WordPress — это плагины, которые часто выполняют HTTP запросы на внешние источники. В этой статье мы расскажем как найти и устранить подобные запросы.

Внешние HTTP запросы

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

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

В самом ядре WordPress проверка на обновления происходит раз в 12 часов, и принудительно при посещении страницы «обновление» (поэтому она иногда так долго грузится), а на другие разделы сайта это влиять никак не должно.

В темах и плагинах WordPress

В плагинах и темах для WordPress, особенно типа «премиум» к сожалению дела обстоят намного хуже. Некоторые подобные продукты проверяют лицензионный ключ или собирают статистику при каждом посещении любой страницы, включая фоновые и AJAX запросы. Делают они это конечно же при помощи внешних HTTP запросов функциями wp_remote_request() или еще хуже – curl_exec() или file_get_contents().

Когда используются эти функции по умолчанию весь процесс PHP блокируется до получения полного ответа от третьей стороны, или по истечению (по умолчанию) пяти секунд. То есть если сторонний сервер, куда выполняется запрос, по какой-либо причине не отвечает, то каждый просмотр вашего сайта будет на пять секунд медленнее.

Как найти подобные HTTP запросы

С помощью плагинов Debug Bar и Debug Bar Remote Requests вы можете посмотреть запросы выполненные во время посещения конкретной страницы WordPress:

Работа с плагином Debug Bar Remote Requests

Работа с плагином Debug Bar Remote Requests

В этой панели вы увидите общее количество запросов, общее время и время для каждого запроса, а также, что самое интересное, откуда поступил вызов функции на внешний HTTP запрос. Это даст вам понять, какой именно плагин или какая тема выполняет тот или иной запрос.

Учтите, что при этом вы должны выполнить вход как администратор, а если вас интересуют HTTP запросы выполняемые в других контекстах, например в AJAX запросах или в Cron-задачах, то вы можете воспользоваться модулем HTTP Logger в плагине Core Control, или самостоятельно выводить информацию о запросах, например в лог ошибок PHP при помощи специального события http_api_debug:

add_action( 'http_api_debug', function( $response, $type, $class, $args, $url ) {
    error_log( 'URL: ' . var_export( $url, true ) );
    error_log( 'Args: ' . var_export( $args, true ) );
    // ...
}, 10, 5 );

Как быть с curl_exec() и file_get_contents()?

Вышеперечисленные плагины и событие срабатывают только для тех запросов, которые выполняются при помощи HTTP API в WordPress, но часто авторы тем и плагинов используют сторонние фреймворки, или же сами пишут запросы, используя напрямую библиотеку cURL, функции file_get_contents() и другие.

Подобные запросы «отловить» немного сложнее, но если ваш хостинг-провайдер позволяет вам использовать средства профилирования PHP кода (например Xdebug или XHProf), то они сразу все всплывут в отчете.

Если вы используете XHProf, то мы рекомендуем попробовать сохранять профили всех запросов к вашему сайту, время исполнения которых превышает 2 секунды:

// wp-config.php
xhprof_enable( XHPROF_FLAGS_MEMORY | XHPROF_FLAGS_CPU );

register_shutdown_function( function() {
    if ( timer_stop() < 2.0 )
        return;

    $data = xhprof_disable();
    file_put_contents( sprintf( '/tmp/profile-%d.xhprof', time() ), serialize( $data ) );
} );

Таким образом в директорию /tmp на сервере будут сохранены профили медленных запросов, которые можно будет в дальнейшем просмотреть через веб-интерфейс XHProf. При большом объеме трафика и медленных запросов, директория может переполниться профилями, так что не забывайте их своевременно удалять.

Как устранить HTTP запросы

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

Запрос можно также закэшировать на время при помощи транзита:

$key = 'my-slow-request';
$data = get_transient( $key );
if ( false === $data ) {
    $r = wp_remote_get( ... );
    $data = wp_remote_retrieve_body( $r );
    set_transient( $key, $data, 24 * HOUR_IN_SECONDS );
}
// ...

Таким образом этот медленный запрос будет выполняться лишь раз в 24 часа, а для высоконагруженных проектов мы всегда рекомендуем выполнять такие запросы фоном, при помощи библиотеки TLC Transients.

Заключение

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

На производительность влияют также опции и транзиты, сложные запросы в базу данных, в том числе поиск по мета-данным, правильная настройка кэширования и конфигурация сервера Nginx/Apache, MySQL/MariaDB, Redis/Memcached и многое другое.

Если у вас возникли вопросы по HTTP запросам, или любые вопросы связанные с производительностью WordPress — оставьте комментарий и мы вам обязательно ответим.

Подписаться на рассылку

Подписаться → Подпишитесь на бесплатную рассылку журнала WP Magazine и получайте новости, события, подборки тем и плагинов, уроки, советы и многое другое в мире WordPress!