Профілювання php коду

In software engineering, profiling ( "program profiling", "software profiling") is a form of dynamic program analysis that measures, for example, the space (memory) or time complexity of a program, the usage of particular instructions, or the frequency and duration of function calls. Most commonly, profiling information serves to aid program optimization.

Іншими словами, профілювання - річ потрібна і корисна. На жаль, IDE безпосередньо в профілювання PHP не можуть (сиджу на Eclipse), тому доведеться зробити ряд рухів тіла.

Xdebug - це розширення для PHP, що дозволяє дебажіть і профілювати код.

sudo apt-get install php5-xdebug

Після чого відкриваємо наш php.ini.

sudo nano /etc/php5/apache2/php.ini

і додаємо туди наступне:

# xdebug
xdebug.profiler_enable = OFF
xdebug.profiler_output_name = xdebug.out.% t
xdebug.profiler_output_dir = / tmp
xdebug.profiler_enable_trigger = ON

  • xdebug.profiler_enable - за замовчуванням профайлер вимкнений;
  • xdebug.profiler_enable_trigger - але його можна включати за допомогою тригера, тригером служить змінна XDEBUG_PROFILE. передана через печеньки, POST або GET запити (т. е. щоб запустити профайлинг файлу index.php. його треба запустити з GET параметром index.php? XDEBUG_PROFILE);
  • xdebug.profiler_output_name - шаблон імен одержуваних логів;
  • xdebug.profiler_output_dir - куди ці логи будуть зберігатися (папка повинна існувати і повинні бути встановлені права на запис).

Не забуваємо перезапустити Апач:

sudo service apache2 restart

Ось і все, власне. Переходимо в броузері на потрібну сторінку потрібного нам сайту з додаванням GET запиту-тригера, дивимося папочку, куди пишуться логи. Повинні почати з'являтися файліки, ось приблизно з таким вмістом:

cfl = php: internal
cfn = php :: preg_replace
calls = 1 0 0
1450 0

І так кілька десятків тисяч рядків. Але ж хочеться хоч якийсь візуалізації, графіків там красивих. Тоді доведеться обзавестися переглядач логів. Їх кілька, я зупинився на KCachegrind.

KCachegrind

KCachegrind ставиться все також елементарно:

sudo apt-get install kcachegrind

Буквочка "K" спочатку назви програми як би говорить про те, що робилося все під KDE, а ми швидше за все сидимо під Gnome. Ну, тому що Gnome краще KDE. Ось. Ну і через це при старті програми можуть полізти помилки з klauncher. Лікується просто, треба доставити плагінів:

sudo apt-get install kdelibs5-plugins

Запускаємо програму, відкриваємо потрібний файл логів і милуємося. А милуватися є на що - лістинг абсолютно всіх викликаються функцій, кількість викликів, витрачений час в мікросекундах, можливість переглядати джерело кожної функції у вихідному коді, ну і просто кумедні графіки:

Профілювання php коду

Профілювання php коду

Профілювання php коду

Профілювання php коду

І все б добре, якщо не одне але. Xdebug версій 2.x не може в профілювання пам'яті. Зовсім. А пам'ять вона ж важлива. Дуже. І профілювати її теж хочеться. Варіантів основних два: використовувати або xhprof (саморобка Facebook'а), або memprof. Я зупинився на останньому, т. К. Він дозволяє генерувати логи для все того ж KCachegrind'а.

Для установки виконуємо наступні команди:

sudo apt-get install libjudy-dev libjudydebian1
sudo pecl install memprof

Потім створюємо memprof.ini.

sudo nano /etc/php5/mods-available/memprof.ini

і під кінець підключаємо модуль і перенавантажуємо Апач:

sudo php5enmod memprof
service apache2 restart

Як це працює. На початку необхідного вихідного коду треба включити memprof. а в кінці зберегти логи в потрібне нам місце:

memprof_enable ();
// Наш код.
memprof_dump_callgrind (fopen ( "/ tmp / logs.out", "w"));

Ну а тепер залишилося тільки відкрити створений файл логів в програмі KCachegrind і дивитися хто скільки кушенькает пам'яті.