Каждый PHP-разработчик, работающий с экосистемой Bitrix Framework, должен глубоко понимать работу её ключевых компонентов. В этой статье мы проведем подробный аудит темы «Sql Tracker: Руководство разработчика», проанализируем лучшие практики и покажем, как правильно использовать запросов в реальных задачах.
—
title: Отладка запросов
—
Класс 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();💡 Экспертное мнение и рекомендации
Практические рекомендации:
- При написании кастомных компонентов для «Sql Tracker: Руководство разработчика» всегда разделяйте бизнес-логику и представление (шаблон).
- Используйте отладку SQL-запросов через конструкцию
$wpdb->last_queryили стандартный трекер Битрикса, чтобы контролировать нагрузку.
Похожая задача в бизнесе?
Помогу автоматизировать процессы и внедрить ИИ
Меня зовут Андрей Горошко. Я Full-stack разработчик и эксперт по 1С-Битрикс. Настраиваю CRM Битрикс24, разрабатываю защищенные API и создаю умных ИИ-агентов для автоматизации рутины.
или на почту: gorandvas@yandex.ru