Отладка запросов WordPress REST API с Query Monitor

Плагин Query Monitor включает некоторые функции для просмотра отладки и информации о производительности запросов REST API на вашем сайте WordPress.

Версия 3.7, выпущенная на днях, представляет еще одну новую функцию, позволяющую вам увидеть еще больше информации о производительности, которую вы ожидаете от Query Monitor.

Аутентификация

Подобно запросам к фронтенду или административной области вашего сайта, для просмотра отладочной информации для REST API вам необходимо выполнить запрос, авторизовавшись как пользователь, имеющий право просматривать результаты Query Monitor, например, администратор.

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

Начиная с версии QM 3.7 ответ также будет включать полную отладочную информацию о запросах, HTTP API, объектном кэше и многом другом.

Обзор и информация об ошибках PHP

В ответ будут включены следующие дополнительные HTTP-заголовки:

  • x-qm-overview-time_taken – Время генерации ответа в секундах
  • x-qm-overview-time_usage – Время генерации ответа в процентах от максимального времени выполнения PHP
  • x-qm-overview-memory – Использование памяти
  • x-qm-overview-memory_usage – Использование памяти в процентах от лимита памяти PHP
  • x-qm-php_errors-error-count – Количество возникших ошибок PHP (0 или более)
  • x-qm-php_errors-error-{n} – Подробная информация о каждой отдельной ошибке PHP

Полная информация о производительности и отладке

Когда выполняется запрос REST API, который запрашивается с параметром ?_envelope, в ответе JSON будет присутствовать дополнительное свойство qm (начиная с версии QM 3.7) с информацией о нем:

  • qm.db_queries.dbs – Все запросы к базе данных
  • qm.db_queries.dupes – Дублирование запросов к базе данных
  • qm.db_queries.errors – Запросы к базе данных с ошибками
  • qm.cache – Статистика кэша объектов
  • qm.http – HTTP API запросы и детали ответа
  • qm.logger – Зарегистрированные сообщения и переменные
  • qm.transients – Обновленные транзиты

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

Свойство qm.db_queries.dbs содержит обзорную информацию, а также полную информацию по каждому отдельному SQL-запросу, включая время выполнения, трассировку стека и возвращаемые строки, а свойство qm.http содержит подробную информацию о каждом запрошенном URL, код ответа, время выполнения и трассировку стека.

Пример данных

При GET-запросе к дефолтной конечной точке (эндпоинту), например, example.com/wp-json/wp/v2/posts/?_envelope, вы обычно не ожидаете увидеть серверные HTTP API-запросы или транзиты, обновляемые при каждом запросе, но QM теперь будет раскрывать эту информацию, чтобы вы могли провести расследование!

Вот пример свойства qm в ответе:

{
  "db_queries": {
    "dbs": {
      "$wpdb": {
        "total": 15,
        "time": 0.0108,
        "queries": [
          {
            "sql": "SELECT option_name, option_value FROM wp_options WHERE autoload = 'yes'",
            "time": 0.0011,
            "stack": [
              "wp_load_alloptions()",
              "is_blog_installed()",
              "wp_not_installed()"
            ],
            "result": 317
          },
          {
            "sql": "SELECT * FROM wp_users WHERE ID = '1' LIMIT 1",
            "time": 0.0003,
            "stack": [
              "WP_User::get_data_by()",
              "WP_User->__construct()",
              "wp_set_current_user()",
              "_wp_get_current_user()",
              "wp_get_current_user()",
              "get_current_user_id()",
              "get_user_option()",
              "Classic_Editor::get_settings()",
              "Classic_Editor::init_actions()",
              "do_action('plugins_loaded')"
            ],
            "result": 1
          },
          {
            "sql": "SELECT   wp_posts.ID FROM wp_posts  WHERE 1=1  AND wp_posts.post_type = 'post' AND ((wp_posts.post_status = 'publish'))  ORDER BY wp_posts.post_date DESC LIMIT 0, 5",
            "time": 0.0003,
            "stack": [
              "WP_Query->get_posts()",
              "WP_Query->query()",
              "get_posts()",
              "DoubleUnderscore\entrypoint()",
              "do_action('init')"
            ],
            "result": 5
          }

          /* snip */

        ]
      }
    },
    "errors": {
      "total": 1,
      "errors": [
        {
          "caller": "do_action('init')",
          "caller_name": "do_action('init')",
          "sql": "SELECT *nttFROM table_that_does_not_exist",
          "ltime": 0.00007200241088867188,
          "result": {
            "errors": {
              "1146": [
                "Table 'wp.table_that_does_not_exist' doesn't exist"
              ]
            },
            "error_data": []
          }
        }
      ]
    },
    "dupes": {
      "total": 1,
      "queries": {
        "SELECT wp_posts.ID FROM wp_posts WHERE 1=1 AND wp_posts.post_type = 'post' AND ((wp_posts.post_status = 'publish')) ORDER BY wp_posts.post_date DESC LIMIT 0, 5": [
          3,
          14,
          35
        ]
      }
    }
  },
  "cache": {
    "hit_percentage": 67.8,
    "hits": 931,
    "misses": 442
  },
  "http": {
    "total": 1,
    "time": 0.6586,
    "requests": [
      {
        "url": "https://example.org",
        "method": "GET",
        "response": {
          "code": 200,
          "message": "OK"
        },
        "time": 0.6586,
        "stack": [
          "WP_Http->request()",
          "WP_Http->get()",
          "wp_remote_get()",
          "DoubleUnderscore\entrypoint()",
          "do_action('init')"
        ]
      }
    ]
  },
  "logger": {
    "warning": [
      {
        "message": "Preloading was not found, generating fresh",
        "stack": [
          "DoubleUnderscore\dispatcher()",
          "DoubleUnderscore\entrypoint()",
          "do_action('init')"
        ]
      }
    ],
    "debug": [
      {
        "message": "Language: en_US",
        "stack": [
          "DoubleUnderscore\do_logs()",
          "DoubleUnderscore\entrypoint()",
          "do_action('init')"
        ]
      }
    ]
  }
}

Источник: https://www.kobzarev.com/wordpress/debugging-wordpress-rest-api-requests-with-query-monitor/

Михаил Кобзарёв

Суровый русский тимлид. Жил в Магадане, в офисе московских веб студий и в Тульской деревне. Виртуозно знает WordPress, PHP, ООП, Vue.js и вот это вот все. Делает крутые высоконагруженные сайты, поэтому уже почти захватил весь рынок WordPress разработки в России. Не дает никому делать сайты без спроса. Ведет блог о разработке, дайджест в телеграмме и в ВК. Любит сиськи, баню и радиоэлектронику. 100% патриот (но это не точно). Тролль 542 уровня. Ездит в отпуск раз в 5 лет.

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

%d такие блоггеры, как: