Архив метки: github

Модуль отладки SQL для опенкарта

Сегодня разберу какие изменения я внёс в модуль отладки от open4dev. Изменения простые и будут вполне понятны начинающим разработчикам. Чем меня не устраивал модуль отладки, я описывал в одном из постов.

Ключевые слова MySQL

Подсветка синтаксиса в модуле уже была. Вот она.

Всё самое нужное уже есть. Можно сюда было загнать сразу все ключевые слова SQL, но время деньги, а ещё нужно пост писать. Так что я ограничился только тем, что сразу бросилось в глаза при анализе главной страницы Опенкарта с включённым модулем.
Находим 45 строку и меняем её на такую.

Я добавил несколько ключевых слов и встроенных функций. Результат на картинке ниже.

Добавление строки вызова

Как я уже рассказывал, делается через замечательный back_trace(). Для начала нужно добавить в класс QueryDebug поле для хранения строки. Находим такой участок кода.

И превращаем его.

Этим мы научили объект QueryDebug сохранять массив $backtrace в массиве отчётах о запросах $queies[]. Теперь нужно поправить вызов метода add(). Его можно найти дальше в модуле.

Этот участок модуля для ocmod отвечает за замену строки возврата результата запроса к БД в опенкарте младше 2.2.0.0, на наш, который перехватывает запрос и сохраняет его в лог, попутно считая время выполнения. Добавим в лог информацию о стеке вызовов вызвав debug_backtrace() внутри этого метода.

В опенкарте старше 2.2.0.0 вызов метода query() немного изменился и модуль это учитывает. Отдельная ветка изменений для свежего opencart 2.3.
Было:

Стало после изменений в нашем коде.

На этом изменения движка закончены. Пора приступить к выводу полезной информации.

Сортировка и вывод запросов SQL

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

Стили самое простое — с них и начнём. Находим строку с определением стиля для вывода запросов.

и просто добавляем к определнию стиля свой, пусть будет называться .line

Со стилями разобрались, давайте добавим кнопку. Находим строку с объявлениями кнопок.

И добавляем новую кнопку [By line]

Ну вот. Кнопка на месте. Теперь нужно вывести саму строку с указанием файла и номера строки. Не забываем про css класс .line.
Находим

Меняем на

Из кода видно как собирается строка с указанием файла и линии вызова. Теперь нужно добавить обработчик на нашу кнопку и отсортировать результаты. Всё очень просто.
Для начала находим хвости JS кода.

А теперь перед ним вешаем наш обработчик.

Выглядит страшно и ужасно, но работает надёжно. Сначала получаем нужные нам для последующий сортировки параметры: путь к файлу, номер строки, порядковый номер вызова. Сначала сравниваем имена файлов, если они совпали, значит сравниваем номер строки вызова. Если же и номер совпадает, то просто сортируем по ID. Это позволяет быстро оценить масштабы бедствия.

Вывод максимального объёма выделенной памяти

В добавок ко всему выше написанному можно в две строчки добавить вывод. Добавить к стилю .total, стиль .memory

А перед выводом кнопок сделать вывод memory_get_peak_usage().

Репозиторий проекта на github — Opencart-debug-database-queries

Модуль отладки SQL в опенкарт 2.3

Вчера я написал про допил напильником модуля отладки Debug database queries for Opencart. Изменения очень простые, но сначала о проблеме.

А проблема в том, что модуль выводит кучу SQL запросов с возможностью их сортировки по времени исполнения или по порядку исполнения. Это, конечно, круто, но если я собираюсь оптимизировать и кэшировать запросы, мне нужно знать кто их вызывает.

Как узнать строку в которой произошёл вызов к $DB ?

PHP предоставляет такую возможность благодаря функции debug_backtrace. Она позволяет собрать стек вызовов для метода, с указанием файла и строки. Мне потребовалось сделать ещё сортировку по месту вызова, что бы быстрее определить места особенно нуждающиеся в кэшировании. Для этого добавил новое поле в вывод отладчика [ by line ] и дописал обработчик события. Группировку по строке сделал с помощью JS-функции localeCompare(). Конечно, получило не в алфавитном порядке, и иногда вызовы из одного файла могут быть перемешаны с вызовыми из другого файла. Но все вызовы из одной строки одного файла всегда будут рядом. Это позволяет быстро оценить, сколько раз осуществлялся конкретный вызов к БД.

На сладкое добавил вывод memory_get_peak_usage для определения максимального выделения памяти под выполнение скрипта.

Патч для модуля отладки

Для debug_backtrace я сформировал патч и отослал мейнтейнеру модуля. Посмотрим, что он ответит, на всякий случай сделал копию модуля на github.

UPD. open4dev обещал внести правки в релиз =)