Отладка 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>';