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
Запускаємо програму, відкриваємо потрібний файл логів і милуємося. А милуватися є на що - лістинг абсолютно всіх викликаються функцій, кількість викликів, витрачений час в мікросекундах, можливість переглядати джерело кожної функції у вихідному коді, ну і просто кумедні графіки:
І все б добре, якщо не одне але. 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 і дивитися хто скільки кушенькает пам'яті.