Получение списка SQL-запросов через Devel: отладка в нестандартных сценариях

В процессе разработки на Drupal иногда возникает необходимость проанализировать, какие SQL-запросы выполняются при обработке того или иного запроса. Стандартный интерфейс Devel (например, панель внизу страницы) отлично справляется с этой задачей для обычных HTML-страниц.

Однако, что делать, если мы имеем дело с AJAX-запросом, загрузкой файла через file_transfer() или другими нестандартными точками входа, где стандартный вывод недоступен? В этой статье мы рассмотрим программный способ получения лога запросов с помощью API модуля Devel, который работает в любом контексте.

Модуль Devel предоставляет удобный механизм логирования запросов. Чтобы получить список всех выполненных SQL-запросов за текущий запрос, достаточно использовать следующий код:

Здесь:

  • devel_query_enabled() – проверяет, включено ли логирование запросов в настройках Devel.
  • Database::getLog('devel', 'default') – возвращает объект-логгер для канала devel и целевой базы данных default (обычно это основная БД). Этот объект содержит массив выполненных запросов, время выполнения, стек вызовов и другую полезную информацию.

Важно: данный метод работает только при условии, что модуль Devel установлен и в его настройках включена опция «Collect query log» (находится в разделе /admin/config/development/devel).

Зачем это нужно?

В типичной разработке мы видим отладочную панель Devel на каждой странице. Но при запросах, которые не возвращают HTML-ответ (AJAX, file_transfer, кроны, миграции и т.д.), панель не рендерится, и мы лишены возможности оценить производительность или найти проблемные запросы. Программное получение лога позволяет:

  • Вставить код в любую точку выполнения (например, прямо перед завершением скрипта);
  • Вывести данные в лог-файл, в переменную сессии или даже отправить в мессенджер для оперативного анализа;
  • Использовать в интерактивной отладке с Xdebug, ставя точки останова в нужных местах.

Практический пример: отладка загрузки файла

Рассмотрим ситуацию, когда необходимо проанализировать все запросы, выполненные во время обработки запроса на скачивание файла. В Drupal 7 за выдачу файлов отвечает функция file_transfer() (находится в includes/file.inc). Запрос завершается вызовом drupal_exit() после отправки файла, и никакого HTML-вывода не происходит.

Как нам перехватить лог запросов? Очень просто:

  • Убедитесь, что у вас включено логирование Devel.
  • Откройте файл includes/file.inc (или соответствующий контроллер в современном Drupal) и поставьте точку останова на строке с drupal_exit() (или в деструкторе, который вызывается после завершения скрипта, но проще всего воспользоваться точкой останова в IDE).
  • В момент остановки выполните в окне отладки (или добавьте временный код) следующий фрагмент:

После этого в логах PHP (или в консоли сервера) появятся все выполненные SQL-запросы с подставленными параметрами. Это позволит увидеть, какие запросы инициируются при скачивании файла, и оптимизировать их при необходимости.

Мало букафф? Читайте есчо !

Изменения настроек поля программно Drupal 7

Май 27, 2020 г.

Если вам программно нужно изменить настройки поля в Drupal, то на помощь приходит Field CRUD API. Это набор функций из файла modules/field/field.crud.inc. ...

Читать

Еще один пример работы с EntityFieldQuery

Декабрь 23, 2020 г.

Время от времени продолжаю кодить под drupal 7, публикую еще один пример для работы EntityFieldQuery, на этот раз с фильтром по полю типа term reference. Основная логика точно такая же как и при работе с data полями (где у нас хранятся тексты или ...

Читать

Вывод результатов формы в саму форму после submit

Март 2, 2017 г.

Что делают в большинстве случаев после успешного submit данных формы? Вариантов два - либо показывают системное сообщение drupal_set_messge(), либо производят переадресацию на некую страницу с результатами. Первый вариант почти всегда выглядит неказисто, ...

Читать

Удалить список публикаций со страницы термина таксономии в Drupal

Апрель 10, 2021 г.

Стандартный шаблон страницы термина таксономии taxonomy-term.tpl.php не позволяет управлять выводом публикаций, он лишь служит как обертка для полей термина. Единственная настройка CMS, которая влияет на вывод списка - это переменная default_nodes_main, ...

Читать
 

Комментарии к «Получение списка SQL-запросов через Devel: отладка в нестандартных сценариях»

Понравилась статья? Есть вопросы? - пишите в комментариях.



Комментарий: