Профилирование Php-Приложений С Помощью Xdebug

Добро пожаловать в третью статью о xdebug. К этому моменту вы уже должны были попробовать xdebug, если нет, сделайте это сегодня ;-).

Во-первых статья рассказал о том, как установить и настроить xdebug, и описал некоторые основные функции, такие как улучшение вывода функции var_dump() или печать трассировки стека вызовов при получении сообщения об ошибке.

В вторая часть мы рассматривали эту функцию xdebug как трассировку.

Трассировка содержит все вызовы функций и методов в программе, время запуска, опционально размер памяти, переданные и возвращаемые параметры.

Журнал трассировки может помочь вам понять путь выполнения сложной программы.

Вместо вставки кода отладки внутри программы вы включаете или выключаете трассировку там, где это необходимо, а затем используете такие утилиты, как grep, или собственные PHP-приложения для анализа файла журнала.

В этой статье мы рассмотрим профилирование.

На первый взгляд профилирование похоже на трассировку.

Журнал профилирования не предназначен для людей, он не предназначен для визуализации хода работы программы, но предоставляет нам данные для статистического анализа работающей программы.

Создание журнала профилирования Ниже приведен краткий отрывок из журнала профилирования, созданного xdebug:

fl=php:внутренний fn=php::define 106 3 fl=C:\www\drupal\includes\bootstrap.inc fn=require_once::C:\www\drupal\includes\bootstrap.inc 1 648 cfn=php::define звонки=1 0 0 13 6 cfn=php::define звонки=1 0 0 18 4 cfn=php::define звонки=1 0 0 23 2
Как видите, журнал профилирования нельзя прочитать напрямую.

Мы будем использовать дополнительные инструменты для визуализации и анализа полученных данных.

Итак, профилирование показывает, сколько раз запускалась та или иная линия и сколько времени занял запуск.

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

Поэтому, как и в случае с трассировкой, не запускайте профилирование на производственных серверах.

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

В этом случае будьте осторожны при одновременном запуске xdebug с другими расширениями Zend, такими как загрузчики, оптимизаторы или кэши.

Чтобы xdebug начал записывать журналы профилирования, добавьте

xdebug.profiler_enable=Вкл.

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

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

Во-первых, xdebug по умолчанию записывает журнал профилирования в каталог /tmp. Если вы используете Windows, вам необходимо исправить php.ini следующим образом:

xdebug.profiler_output_dir="c:\traces"
По умолчанию xdebug перезаписывает существующий журнал профилирования.

Вы можете настроить его в дополнение к существующему, добавив следующую команду

xdebug.profiler_append=Вкл.

в php.ini. Бывают случаи, когда не хочется создавать журнал профилирования для всех файлов, но при этом активировать профилирование во время выполнения проблематично.

Вместо периодического включения и выключения профилирования добавьте команду

xdebug.profiler_enable_trigger=Вкл.

в php.ini. Теперь вы можете включать и выключать профилирование, передавая в PHP-скрипт специальный параметр GET или POST XDEBUG_PROFILE. Это включит профилирование только для этого PHP-скрипта.

Не обязательно задавать значение этого параметра, просто не забудьте добавить этот параметр по адресу test.phpЭXDEBUG_PROFILE. Имя журнала профилирования Имя, которое xdebug присваивает журналу профилирования по умолчанию, — «cachegrind.out».

плюс идентификатор процесса.

Как и в случае с журналом трассировки, вы можете изменить названия журналов, добавив соответствующие настройки в php.ini. Имя параметра xdebug.profiler_output_name. Аргумент представляет собой строку.

который может содержать различные модификаторы.

Наиболее важные из них приведены ниже:

  • %p – идентификатор процесса
  • %r – случайное число
  • %u - время
  • %H – значение $_SERVER['HTTP_HOST']
  • %R – значение $_SERVER['REQUEST_URI']
  • %s – имя, включая полный путь, косая черта преобразуется в подчеркивание.

Обратите внимание, что модификатор %s используется только для xdebug.profiler_output_name. Если вы хотите узнать имя журнала профилирования, вы можете вызвать функцию xdebug_get_profiler_filename().

Анализ журнала профилирования Как уже говорилось выше, для анализа журнала профилирования необходимы дополнительные программы для визуализации данных.

Все журналы профилирования, создаваемые xdebug, имеют формат, аналогичный формату Cachegrind. Cachegrind — это профилировщик, который является частью более мощной программы под названием Валгринд , программы отладки и профилирования программного обеспечения для Linux. Cachegrind был разработан для анализа статистики кэшей, использования памяти и команд программы.

Другой инструмент Valgrind, Callgrind, рисует графики вызовов.

Что касается PHP, мы можем использовать это приложение для визуализации и анализа журнала профилирования.

Инструмент, который обычно используется для анализа журнала профилирования, созданного xdebug, называется KCachegrind .

KCachegrind — бесплатное программное обеспечение, распространяемое по лицензии GPL (работает только в системах Unix).

Однако есть простая программа для Windows — WinCachegrind , который также является бесплатным.

Давайте сначала посмотрим на версию для Windows. WinCacheGrind: анализ журналов профилирования в Windows Текущая версия (на момент написания статьи автором) WinCachegrind — 1.0.0.12. Эта версия датируется 2005 годом, а это значит, что WinCachegrind долгое время не разрабатывался.

Если посмотреть примечания к выпуску, то авторы пишут, что в программе есть ошибки, из-за которых она иногда ведет себя странно.

Поэтому я рекомендую использовать KCachegrind, запущенный на базе виртуальной машины на последнем дистрибутиве Linux, например Ubuntu (примечание переводчика, вообще говоря, странная рекомендация; в этом случае я бы рекомендовал просто установить Linux, а не городиться сад виртуальных машин).

Под Windows доступно огромное количество виртуальных машин.

Если по какой-либо причине невозможно использовать Unix или виртуальную машину, вы можете продолжать использовать WinCachegrind для простого анализа журнала профилирования.

WinCachegrind не рисует графы вызовов, в отличие от KCachegrind. Установить Wincachegrind чрезвычайно просто.

Запустите установщик, нажмите кнопку принятия лицензии и установка завершена.

Теперь вы можете запустить программу и открыть один из журналов профилирования кэшгринда, созданный xdebug.

Профилирование PHP-приложений с помощью xdebug

Нажимая на часы или значок сигмы, вы можете переключаться между отображением информации в абсолютных значениях и процентах.

Отображение в процентах показывает, сколько времени (в процентах от общего времени) требуется для вызова функции в данном блоке.

Две полезные настройки: «Профилировщик -> Скрыть быстрые функции» и «Профилировщик -> Скрыть библиотечные функции».

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

Вторая настройка Profiler -> Hide Library Functions скрывает от общего анализа функции, встроенные в PHP. Когда обе эти настройки включены, вы видите меньше данных, что позволяет вам сосредоточиться на областях вашего кода, требующих оптимизации.

Главное окно содержит две вкладки: Построчно и Всего.

На обеих вкладках отображается одна и та же информация, но на вкладке «Общие» информация агрегируется для лучшего представления.

Само время отображает время выполнения кода в текущем блоке, а совокупное время (Cum.) показывает общее время выполнения функций в данном блоке.

KCacheGrind: анализ логов профилирования в Unix Версия KCachegrind для Unix предоставляет больше функций, чем WinCachegrind. KCachegrind визуализирует данные и строит граф вызовов.

Чтобы начать его использовать, вам необходимо установить KCachegrind. Текущая версия 0.4.6 .

Доступна более новая версия (0.10.1), но она является частью пакета Valgrind. Если возможно, используйте менеджер пакетов для установки пакета KCachegrind. KCachegrind использует GraphViz для рисования графиков вызовов, поэтому вам также необходимо установить пакет GraphViz, если ваш менеджер пакетов не устанавливает автоматически зависимые пакеты.

Если вы не найдете двоичный пакет KCachegrind, вам придется скомпилировать KCachegrind самостоятельно.

После скачивания исходников запустите

.

/configure --prefix=/opt/kde3 делать сделать установку

Как вы можете заметить, вам необходимо указать путь к текущей установке библиотеки KDE. Если вы не знаете, где в вашей системе расположены библиотеки KDE, используйте
kde-config --prefix
чтобы отобразить путь к библиотекам KDE. После установки вы можете запустить KCacheGrind из командной строки.

opt/kde3/bin/kcachegrind &
Табличное отображение данных в KCachegrind очень похоже на WinCachegrind. Вы также можете переключаться между абсолютными и процентными значениями.

Некоторые функции KCachegrind не предназначены для PHP. На рисунке ниже показан граф вызовов программы phpMyAdmin:

Профилирование PHP-приложений с помощью xdebug

Как видите, большая часть времени запуска была проведена внутри common.inc.php. На следующем снимке экрана показана визуализация вызовов функций внутри common.inc.php:

Профилирование PHP-приложений с помощью xdebug

Этот блок кода запускает два require_onces, что вдвое меньше времени, необходимого для запуска common.inc.php. Двойной щелчок по любому прямоугольнику приведет вас к более глубокому анализу данных.

Оптимизация кода на основе данных профилирования Всегда профилируйте свои приложения перед оптимизацией.

Вы можете начать оптимизацию самостоятельно, в том месте, где вам кажется, что эта оптимизация принесет эффект, но это не всегда так.

Оптимизация в основном дает эффект только в тех частях, которые занимают больше всего времени в процессе выполнения.

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

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

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

При измерении в разных системах абсолютные значения могут различаться.

Однако прежде чем приступить к оптимизации кода, учтите следующие вещи.

Важным правилом оптимизации является уменьшение количества операций ввода-вывода.

Некоторые операции ввода-вывода занимают очень много времени по сравнению с вычислениями.

Сокращение таких операций может быть очень эффективным способом ускорить вашу программу.

Удаление одного вызова ввода-вывода может обеспечить более эффективное улучшение, чем тратить много часов на оптимизацию кода.

Поэтому вам следует сначала сосредоточиться на операциях ввода-вывода, прежде чем приступать к кодированию.

Вы также можете увеличить количество своих серверов перед оптимизацией.

Вы можете купить огромный, что даст вам небольшой прирост производительности.

Время разработки обходится дороже, чем цена нового сервера.

А если вы увеличите количество оборудования, то можете быть уверены, что получите увеличение сразу же без какого-либо влияния на PHP-код. Когда разработчик тратит один или два дня на оптимизацию кода, никогда нельзя предсказать, насколько вырастет производительность.

И в итоге уже нельзя быть уверенным, что оптимизация не принесет ошибок.

Преобразование некоторых страниц в статические — один из способов повысить производительность.

Допустим, есть сайт с большим трафиком, на котором PHP-скрипт создает первую страницу для каждого запроса, выбирая информацию из базы данных или XML-файла.

Если данные на странице меняются достаточно часто, вы можете воссоздать их статическую копию.

Если преобразование страницы в статический вид невозможно (на странице отображается некоторая личная информация), вы можете преобразовать некоторые блоки в статический вид. Другой уровень оптимизации не требует изменения кода PHP. Как мы знаем, PHP является интерпретируемым языком.

Это означает, что его команды во время выполнения транслируются в промежуточный код. Трансляция повторяется каждый раз при запуске скрипта.

Это делает PHP медленнее по сравнению с такими языками, как C или Java, которые не требуют разбора кода при каждом его запуске.

Для PHP вы можете использовать кэши промежуточных представлений (см.

мой перевод.) для сохранения и повторного использования промежуточного кода, это ускоряет запуск и выполнение.

Все это не означает, что сейчас не время и не место для оптимизации PHP-кода.

Некоторые оптимизации кода могут значительно повысить производительность.

Однако всегда помните, что изменение кода всегда сопряжено с риском появления дополнительных ошибок и проблем с безопасностью.

Также помните, что оптимизация кода делает его менее читабельным.

Заключение Создание и визуализация журнала профилирования — одно из важных условий оптимизации PHP-кода.

Вам нужно знать, какие места в программе занимают больше всего времени, и именно с них следует начинать оптимизацию.

В следующей статье мы рассмотрим отладку с помощью xdebug. xdebug может предоставить вам возможность удаленной отладки.

Используя клиент, обладающий такой возможностью, например Eclipse PDT, вы можете отлаживать код, не изменяя его, устанавливать точки останова, переходить между разделами кода и видеть, как и где переменные меняют значения.

Теги: #профилирование #xdebug #php

Вместе с данным постом часто просматривают: