Получение списка 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-запросы с подставленными параметрами. Это позволит увидеть, какие запросы инициируются при скачивании файла, и оптимизировать их при необходимости.

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

Получить имя поля ключа entity в Drupal 7

Апрель 6, 2021 г.

У меня эта задача возникла при работе с формами, где формы содержат поля '#entity' и '#entity_type'. Нужно было найти универсальный способ прочитать ID объекта, т.к. для каждого объекта имя этого поля может отличаться (для node - nid, для file - fid и ...

Читать

Вывод меню с фиксированной глубиной в Drupal

Март 25, 2019 г.

Блок меню core модуля menu позволяет вывести всю иерархию меню полностью, но иногда требуется показать только 1-2 верхних уровня. Посмотрим как организовать такой вывод. Drupal в модуле menu использует функцию menu_tree('ИМЯ МЕНЮ'), чтобы рендерить ...

Читать

Меняем поведение корневого пункта меню bootstrap dropdown

Апрель 14, 2022 г.

В bootstrap корневой пункт меню с подпунктами (dropdown menu) не является активной ссылкой и лишь служит кнопкой для развертывания подпунктов. Тем временем ...

Читать

Программное создание параграфов (ParagraphsItemEntity) в Drupal

Май 24, 2019 г.

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

Читать
 

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

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



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