Почему мои параллельные запросы AJAX для PHP скриптs/WP REST API настолько медленны?

После некоторого расследования я обновил заголовок вопроса. См. Мои обновления ниже.

Оригинальный вопрос:

Я создаю сайт с Wordpress и иногда использую асинхронные вызовы для конечных точек API WP REST.

Вызов этих конечных точек из моих функций AJAX часто приводит к времени TTFB не менее ~ 780 мс:

введите описание изображения здесь

Но если я открою URL/конечную точку непосредственно в браузере, я получаю TTFB раз, что на 4-5 раз быстрее:

введите описание изображения здесь

Интересно, откуда происходят задержки. Я запускаю эту страницу на своем локальном dev-сервере с включенными Apache 2.4, HTTP/2 и PHP 7.

Каков наилучший способ отслеживания таких проблем?

Обратите внимание: Я не, используя встроенную AJAX-функцию Wordpress. Я просто называю что-то вроде

axios.get(`${url}/wp-json/wp/v2/flightplan`)

внутри компонента React, который я установил на моем домашнем шаблоне.

Update

Черт, интересно: очистка файлов cookie уменьшает TTFB много:

введите описание изображения здесь

Обновление 2

После удаления других вызовов AJAX запрос flightplan выполняется намного быстрее. Я думаю, что есть некоторые проблемы с параллельными запросами AJAX. Я немного читал о блокировке сеансов, но поскольку Wordpress и все установленные плагины не используют сеансы, это не может быть причиной.

Обновление 3

Определенно, это как-то связано с настройкой моего локального сервера. Просто развернул сайт на "реальном" веб-сервере:

введите описание изображения здесь

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

Обновление 4

Я сделал небольшой тест: вызывая 4 фиктивных запроса перед вызовом "реальных". script возвращает строку "Foobar". В это время все выглядит нормально:

введите описание изображения здесь

Но при добавлении sleep(3) в манекен AJAX- script все остальные запросы занимают гораздо больше времени:

введите описание изображения здесь

Почему?

Ответ 1

Каждый раз, когда AJAX-запрос обслуживается WordPress, загружаются все ядро ​​WordPress, активная тема и все активные плагины. Мы можем сократить эти накладные расходы, исключив определенные плагины из загрузки для определенных запросов, используя плагин Must Use.

Итак, для оптимизации загрузки над плагинами, которые не нужны для запроса AJAX. вы должны игнорировать некоторые плагины. Вы можете использовать MU (обязательно) codex для загрузки только тех плагинов, которые нуждаются в целом веб-сайте.

Плагины MU сильно отличаются от обычных плагинов WordPress. Они устанавливаются в специальной/wp-content/mu-plugins/папке отдельно от обычных плагинов. Они активны до тех пор, пока они находятся в этой папке. Чтобы отключить их, вам необходимо удалить их из этой папки. Плагин MU также выполняется до загрузки плагинов.

Вот почему мы используем плагин MU. Мы можем опередить загрузку обычных плагинов и контролировать, какие из них загружены.

Наш плагин MU в этом случае состоит из одной функции:

function wpmdbc_exclude_plugins( $plugins ) {
    if ( !defined( 'DOING_AJAX' ) || !DOING_AJAX || !isset( $_POST['action'] ) || false === strpos( $_POST['action'], 'wpmdb' ) ) return $plugins;
    $wpmdb_settings = get_option( 'wpmdb_settings' );
    if ( !empty( $wpmdb_settings['blacklist_plugins'] ) ) {
        $blacklist_plugins = array_flip( $wpmdb_settings['blacklist_plugins'] );
    }
    foreach( $plugins as $key => $plugin ) {
        if ( false !== strpos( $plugin, 'wp-migrate-db-pro' ) || !isset( $blacklist_plugins[$plugin] ) ) continue;
        unset( $plugins[$key] );
    }
    return $plugins;
}
add_filter( 'option_active_plugins', 'wpmdbc_exclude_plugins' );

Как вы можете видеть, они подключались к фильтру. Поэтому, когда get_option ('active_plugins');, эта функция будет выполнена и может изменять, какие плагины активны.

Первый условный оператор обеспечивает обработку запроса WP Migrate DB Pro AJAX, и если мы не залогом, позволяя WordPress выполнять запрос как обычно, загружая все активные плагины.

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

Ответ 2

Поскольку ваш вызов Ajax будет ждать загрузки всех ваших плагинов WP:)

Итак, вам нужно сделать какой-либо тест без плагина и активировать один за другим, чтобы увидеть, какой из них замедляет ваш вызов ajax.