
Кто хотя бы раз работал в вебстудии над создаваемыми сайтами, знает, что используемые там универсальные движки очень даже норовистые. Чуть не уследил за правильной кастомизацией кода под требования клиента — на получи тормоза при открытии его страниц.
И ведь не сразу найдёшь, где же в глубинах проекта образовался проблемный фрагмент, начавший поглощать ресурсы сайта.
Для поиска таких мест были созданы разные инструменты профилирования. Этим термином называют всестороннее измерение нагрузки, оказываемой исследуемым скриптом на сервер сайта. Например, для языка PHP наиболее известными профилировщиками кода являются следующие: Blackfire, Xdebug Profiler, Tideways, XHProf/XGHui.
Но что если вам важнее не разноплановый функционал популярных инструментов, сколько возможность в один щелчок побыстрее выполнить основную функцию: замерить нагрузку сразу по всем задействованным файлам CMS и понятно визуализировать результат.
Для решения подобной узкой задачи я разработал очень простой бесплатный профилировщик PHP. Так сказать, студийную версию профайлера, то есть урезанную до объёма, достаточного вебмастеру при работе над проектами в студии. И делюсь этим скриптом с сообществом. Кому интересно, прошу под кат.
Что замеряет
Как я уже говорил выше, функциональность моего профилировщика ограничена типичными студийными задачами:
-
показать вероятные места подтормаживания сайта клиента;
-
измерить насколько меняется нагрузка после установки плагина, компонента, свёрстанной темы;
-
измерить какая из отобранных CMS менее тяжеловесная согласно техзадания к новому проекту.
Соответственно, измеряемыми параметрами являются следующие:
-
Такты — это количество инструкций, распарсенных препроцессором PHP во время исполнения скриптовых файлов вашего сайта, задействованных при обработке запрошенного URL.
В общем случае, чем больше данное число, тем значит сложнее написан код серверной стороны использованного на сайте движка.
Этот показатель измеряется по всему стеку задействованных файлов в виде суммарного значения.
-
Память — это количество байт, потраченных скриптовыми файлами сайта сверх того объёма, что сервер выделил препроцессору по умолчанию.
Показатель измеряется по всему стеку задействованных файлов в виде суммарного значения и отдельно по каждому в виде прироста относительно предыдущего показателя.
Расход памяти связан либо с парсингом самого исполняемого скрипта, поскольку это выражается в компиляции его байт-кода с сохранением в ОЗУ. Либо связан с хранением содержимого локальных переменных в процессе исполнения этого скрипта. Чем больше получилось такое число, тем значит более крупными объёмами данных манипулируют в этой точке.
Здесь также возможны показатели с отрицательными числами, означающими, что в этом месте высвободился некий объём ОЗУ, например сборщиком мусора в результате обнуления переменной или удаления неиспользуемой более.
-
Время — это количество времени, затраченного препроцессором на исполнение скриптовых файлов сайта. Отображается в форме
ч:мм:сс.микросекундыс отбросом пустых сегментов слева, если часы, минуты, секунды оказались равны нулю. Микросекунды же показываются в любом случае, даже при нуле, означая тогда, что здесь затраченное время находилось в диапазоне наносекунд.Показатель измеряется по всему стеку задействованных файлов в виде суммарного значения и отдельно по каждому.
-
Вызовы — это количество подлючений каждого скриптового файла в стек вызовов при обработке запрошенного URL.
Показатель измеряется по всему стеку задействованных файлов в виде суммарного значения и отдельно по каждому. Обычно все эти показатели равны 1, но могут быть случаи с иным значением, если какой-то скриптовый файл подключается ещё раз из другого скрипта.
Я хотел также добавить в профилировщик ещё и замеры обращений к базе данных, но в первой версии не стал это делать, так как круг применения всё же сводился к студийным задачам.
Где скачать
Свой профилировщик я назвал StudyLIC — это сокращение от «Study the Load It Creates — исследуй нагрузку, которую оно создаёт». Исходные коды данного скрипта на PHP можете взять в любом из моих репозиториев:
Конструктивные особенности скрипта:
-
установщик, деинсталлятор и сам блок измерителя собраны в едином файле;
-
встроенная возможность сохранить отчёт измерителя в виде статического HTML-файла;
-
мультиязычный интерфейс: английский (по умолчанию), русский.
Системные требования:
-
веб-сервер, например Apache 2.x;
-
PHP версии 7.x или выше.
Я также добавил в репозиторий папку app-example с воображаемым приложением из 3 файлов чисто для тестовых целей, на его основе я сделаю демонстрационные скриншоты ниже.
Как установить
Предположим, у вас на сайте под URL-ом //example.com/app-example/ уже развёрнуто некое приложение на PHP, которое вы хотите исследовать на предмет создаваемой нагрузки.
Для начала вам понадобится установить туда профилировщик. Это действие выполняется в 2 шага, а результат показан на следующем скриншоте:
-
Скопируйте файл
studyLIC-installer.phpв директорию исследуемого приложения. -
Откройте в браузере URL
//example.com/app-example/studyLIC-installer.php— это и есть установщик. Он автоматически проставит во всех скриптовых файлах вашего приложения точки наблюдения и покажет под спойлером отчётный список файлов.
Как использовать
После успешной установки профилировщика вам нужно выполнить 2 следующих действия для каждой страницы приложения, которую хотели бы измерить:
-
Откройте в браузере URL интересующей страницы, добавив к нему GET-параметр
studyLIC— в результате на экране появится отчёт с показаниями замера. Результат выводится таблицей с общим итогом, а пофайловые строки будут спрятаны под спойлер. -
Нажмите в нижней части отчёта кнопку
Скачать копию, чтобы сохранить отчёт на свой компьютер в виде статического HTML-файла для изучения позже.
Как удалить
В конце исследовательской работы следует запустить деинсталлятор для удаления профилировщика, а точнее его точек наблюдения, которые были проставлены во время установки:
-
Снова скопируйте файл
studyLIC-installer.phpв директорию исследуемого приложения. -
Откройте в браузере тот же URL как при установке, только добавьте к нему GET-параметр
uninstall. В итоге профилировщик автоматически удалит проставленные ранее точки наблюдения.
Недостатки
В процессе эксплуатации профилировщика выявились следующие недочёты:
-
В его установщике реализован прогресс-индикатор, опирающийся на CSS стилизацию псевдо-поллинга, несколько напоминающего режим Server Sent Events.
Только серверными уведомлениями здесь выступают теги
<p>, прилетающие через грузящуюся HTML-разметку страницы, пока серверная часть выполняет простановку точек наблюдения.Однако подобная стилизация сильно зависит и от настройки буферизации PHP и от особенности работы конкретной версии браузера пользователя, а именно способен ли тот отображать содержимое незакрытых DOM-нод или будет ждать закрывающего тега. Ведь прилетающие теги серверных уведомлений невольно оказываются внутри ещё незакрытой ноды спойлера.
На худой конец, можно просто заменить на обычную CSS-крутилочку, чтобы только показать пользователю, что процесс идёт, не уточняя какой именно процент действия сейчас завершён.
-
Смена языка интерфейса действует лишь на текущий запуск скрипта. При следующем тут же сбрасывается на дефолтный язык.
Мелочь, и вроде не мешает, но как-то не айс.
-
Значения колонки расходов
Памятьв таблице исследованных файлов имеют смещение на 1 ячейку вниз. С технической точки зрения это вроде бы верно, так как измерено потребление памяти на момент вызова каждого файла.Но с логической точки зрения — не совсем верно. Ведь исследователя, скорее всего, будет интересовать вопрос, какой именно файл создал такое потребление памяти — и этот файл как раз находится строчкой выше.
Например, на втором скриншоте было показано, что якобы файл
blocks/footer.phpпотребил дополнительных ~500 килобайт памяти. На самом деле источником этого был файлblocks/header.php, что следует из его исходного кода. -
Имя файла, сохраняемого кнопкой
Скачать копию, сейчас одинаково для любого исследуемого URL-а, что неудобно при сохранении отчётов от серии исследуемых страниц.То есть надо вручную править имя очередной сохраняемой копии, чтобы не перезаписать предыдущий только что сохранённый файл. Было бы логичней автоматически формировать имя файла с уникализацией по URL.
-
В момент деинсталляции отсутствует прогресс-индикатор, из-за чего на больших проектах с тысячами файлов работа деинсталятора выглядит подвисшей — несколько секунд белого экрана, пока идёт обработка файлов.
Можно тоже приделать здесь обычную CSS-крутилочку.
-
В отчёте деинсталяции показано лишь общее число файлов, в которых были сняты точки наблюдения. И хотя подобная краткость на этом этапе работы приложения не так уж критична, но всё-таки здесь желательно видеть полный список изменённых файлов в той же форме, как сделано в установщике.
Идеи, мысли, предложения
Если вы из студийной команды и вам понравился мой профилировщик, но по вашему мнению, там не хватает какой-то детали, напишите свои соображения об улучшении функционала.
Не факт, что я сразу же побегу реализовывать. Однако если высказанная мысль покажется мне в самом деле полезной, доработаю профилировщик как появится свободная минута.
ссылка на оригинал статьи https://habr.com/ru/articles/1058322/