Получение списка 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 Webform

Ноябрь 23, 2025 г.

В Webform для Drupal 7 нет отдельного типа элемента, который отвечал бы за одиночный чекбокс. Если возникает задача добавить в форму знакомую всем галочку ...

Читать

Показ анимации, что идет загрузка, для обновления контента views в режиме ajax

Май 22, 2021 г.

Подгрузка данных с сервера (например, при изменении параметров фильтра) происходит с небольшой задержкой, потому пользователь может не понять, среагировал как то сайт или нет на его действия. Задача состоит в том, чтобы показать, что идет загрузка ...

Читать

Вывод данных с группировкой во views drupal

Ноябрь 15, 2019 г.

Типичная проблема при использовании модуля views - как вывести результат группировки, т.е. столбец вроде COUNT(*). Это можно сделать штатными средствами ...

Читать

Вывод сообщений валидации формы рядом с формой

Март 20, 2019 г.

При возникновении ошибок, во время проверки формы друпал выполняет две вещи, которые отражаются на фронт-энд - добавляет сообщение об ошибке в стек сообщений и маркирует классом error поле, содержащее ошибку. Если форма находится далеко от места вывода ...

Читать
 

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

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



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