Плагин 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
– Время генерации ответа в процентах от максимального времени выполнения PHPx-qm-overview-memory
– Использование памятиx-qm-overview-memory_usage
– Использование памяти в процентах от лимита памяти PHPx-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/