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

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

Примеры работы с EntityFieldQuery

Декабрь 7, 2017 г.

Один раз начав работать с EntityFieldQuery, вы уже не захотите городить SQL запросы с джойнами таблиц полей сущностей. Что то сложное, возможно, сделать будет слишком трудно на этом конструкторе, но типовые выборки данных делать приятно, быстро и удобно. ...

Читать

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

Май 22, 2021 г.

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

Читать

Ctools modal закрытие при клике вне модального окна

Июнь 28, 2019 г.

Привычное для пользователей поведение модального окна изначально не реализовано в ctools. Давайте добавим немного js, реализующего нужный функционал. Код универсален для модального окна создаваемого ctools, т.к. привязан к верстке окна: [crayon-6a8b2f5950a1e808749617/] ...

Читать

Получить список прав определенной роли

Июнь 19, 2026 г.

Когда прав очень много, не удобно смотреть через админку, что же там выдано в роли. Особенно, если роль точечно добавляет несколько разрешений. Вот небольшой спиппет кода, который выводит список разрешений (permissions) для указанной роли. [crayon-6a8b2f5950b0b031073846/] ...

Читать
 

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

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



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