Отладка запросов

Класс 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();