Отладка запросов
Класс Bitrix\Main\Diag\SqlTracker используется для отладки и анализа SQL-запросов:
-
замеряет время выполнения,
-
собирает стек вызовов,
-
сохраняет параметры запросов
binds.
Запустить трекинг
Метод startTracker запускает трекинг.
$tracker = \Bitrix\Main\Application::getConnection()->startTracker(true);
-
true— начинает новый трекинг и прерывает предыдущий. -
false— продолжает текущий трекинг.
Выполнить запрос
// Пример явного SQL-запроса
\Bitrix\Main\Application::getConnection()->query("UPDATE b_user SET NAME='Test' WHERE ID=1");
Получить результат
foreach ($tracker->getQueries() as $query) {
print_r([
$query->getSql(), // текст запроса
$query->getTime(), // время в секундах
$query->getTrace(), // стек вызовов
$query->getNode(), // ID ноды кластера или null
$query->getBinds(), // параметры запроса
]);
}
Трекинг автоматически останавливается при завершении скрипта.
-
getNode()— возвращаетnull, если БД не кластеризована. -
getBinds()— содержит параметры, переданные вConnection::query().
Пример. Выбрать три самых медленных запроса.
$queries = $tracker->getQueries();
usort($queries, fn($a, $b) => $b->getTime() <=> $a->getTime());
$slowestQueries = array_slice($queries, 0, 3); // Получаем три самых медленных запроса
Дополнительные методы
-
Получить общее количество запросов:
$count = $tracker->getCounter(); -
Получить общее время выполнения:
$totalTime = $tracker->getTime(); -
Управлять глубиной стека:
$tracker->setDepthBackTrace(10); // Установить глубину стека $depth = $tracker->getDepthBackTrace(); // Получить текущую глубину
Записать лог трекера в файл
Записывать лог можно с помощью методов startFileLog и stopFileLog.
// Запускаем трекинг
$tracker = \Bitrix\Main\Application::getConnection()->startTracker(true);
// Указываем путь к файлу лога
$logPath = $_SERVER['DOCUMENT_ROOT'].'/upload/sql_queries.log';
// Начинаем запись логов в файл
$tracker->startFileLog($logPath);
// Получаем объект соединения с БД
$connection = \Bitrix\Main\Application::getConnection();
// Выполняем SQL-запросы. Они будут записаны в лог
$connection->query("SELECT * FROM b_file");
$connection->query("SELECT * FROM b_module_to_module");
// Останавливаем запись логов
$tracker->stopFileLog();
Скопировано
Предыдущая
Следующая