Полный цикл в digital

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

В ядре D7 для отслеживания SQL-запросов используется так называемый SQL-трекер. При использовании трекера при каждом запросе к БД, метод Bitrix\Main\DB\Connection::queryInternal в трекер записывает запрос и время начала и окончания. Трекер является объектом класса Diag\SqlTracker.

Для получения трекера и включения отслеживания нужно получить объект текущего соединения и вызвать метод startTracker():

// подключаем класс для вывода SQL запроса
$connection = Bitrix\Main\Application::getConnection();
// старт трекера
$tracker = $connection->startTracker();
//****
// любой SQL запрос 
//****
// стоп трекера
$connection->stopTracker();

После вызова startTracker() до вызова stopTracker() все запросы будут отслеживаться. Каждый запрос представлен объектом класса Bitrix\Main\Diag\SqlTrackerQuery, коллекцию можно получить вызвав метод Diag\SqlTracker::getQueries:

foreach ($tracker->getQueries() as $query) {
    // текст запроса
    var_dump($query->getSql()); 
    // стек вызовов функций, которые привели к выполнению запроса
    var_dump($query->getTrace()); 
    // время выполнения запроса в секундах
    var_dump($query->getTime()); 
}

Для очистки данных в трекере и начала нового отслеживания, нужно вызвать startTracker() с аргументом $reset = true:

$tracker = $connection->startTracker(true);

Пример отслеживания запросов:

// подключаем модуль инфоблоки
Bitrix\Main\Loader::includeModule("iblock");
// подключаем класс для вывода SQL запроса
$connection = Bitrix\Main\Application::getConnection();
// старт трекера
$tracker = $connection->startTracker();
// SQL запрос 
$query = Bitrix\Iblock\ElementTable::getList(array(
    'select' => array('ID', 'NAME'),
    'filter' => array('IBLOCK_ID' => 2),
));
// стоп трекера
$connection->stopTracker();
echo '<pre>';
foreach ($tracker->getQueries() as $query) {
    // текст запроса
    echo 'SQL запрос:' . '<br>';
    var_dump($query->getSql());
    // время выполнения запроса в секундах
    echo 'Потраченное время на SQL запрос:' . '<br style="margin-top: 30px;">';
    var_dump($query->getTime());
    // стек вызовов функций, которые привели к выполнению запроса
    echo 'Стек вызовов функций, которые привели к выполнению запроса:' . '<br style="margin-top: 30px;">';
    var_dump($query->getTrace());
}
echo '</pre>';
Заполните форму уже сегодня!
Для начала сотрудничества необходимо заполнить заявку или заказать обратный звонок. В ответ получите коммерческое предложение, которое будет содержать индивидуальную стратегию с учетом требований и поставленных задач
Работаем по будням с 9:00 до 18:00. Заявки, отправленные в выходные, обрабатываем в первый рабочий день до 12:00.
Спасибо, ваш запрос принят и будет обработан!
Эйч Маркетинг