Xdebug - profilowanie aplikacji PHP

Profilowanie i debugowanie aplikacji PHP z wykorzystaniem XDebug i KCachegrind

Xdebug to program do profilowania i debugowania kodu PHP. Od wersji 2.* posiada znacznie więcej opcji i możliwości. Dokumentacja jak i sama aplikacja dostępna jest na stronie projektu www.xdebug.org. Poniżej omówię kilka ciekawszych opcji Xdebug.

Zużycie pamięci

Jeżeli PHP skompilowane zostało z opcją --enable-memory-limit to w xdebug będziemy mieć dostęp do funkcji xdebug_memory_usage() i xdebug_peak_memory_usage(). Pierwsza zwraca (int) ilość zajmowanej pamięci przez wykonujący się właśnie skrypt, druga zwraca największe zużycie pamięci (od początku do momentu wywołania funkcji)
<?php
$x = file_get_contents('a.pdf');
echo xdebug_peak_memory_usage()/1048576;
Po wczytaniu 4.6MB plik pdf funkcja xdebug zwraca pik 4.61658477783 MB zajętej pamięci.

Śledzenie wykonywania się kodu

xdebug_start_trace(string trace_file [, integer options]) - za pomocą tej funkcji uruchamiamy śledzenie wykonywania się kodu. Pierwszy parametr to nazwa pliku, do którego mają być zapisane dane a drugi to albo 0 albo 1 - ustala formatowanie danych, w przypadku 1 dane będą dodatkowo dopisywane do pliku (nie będą nadpisywane istniejące dane.
<?php
xdebug_start_trace('a', 0);
$x = file_get_contents('a.pdf');
$x = substr($x, 0, 1000);
$x = base64_encode($x);
xdebug_stop_trace();
Przykładowy wynik:
TRACE START [2008-11-11 19:04:15]
    0.0012     189752     -> define() /srv/http/html/punbb-1.2.20/index.php:27
    0.0017     264176     -> require(/srv/http/html/punbb-1.2.20/include/common.php) /srv/http/html/punbb-1.2.20/index.php:28
    0.0017     264176       -> defined() /srv/http/html/punbb-1.2.20/include/common.php:32
    0.0048     850384       -> require(/srv/http/html/punbb-1.2.20/include/functions.php) /srv/http/html/punbb-1.2.20/include/common.php:37
    0.0048     850456         -> function_exists() /srv/http/html/punbb-1.2.20/include/functions.php:653

Profiler Kodu

Wystarczy dodać do php.ini:
xdebug.profiler_enable=1
xdebug.extended_info=0
xdebug.remote_enable=0
xdebug.auto_trace=0
xdebug.profiler_output_dir=/ścieżka/do/katalogu
Gdzie /ścieżka/do/katalogu to ścieżka do katalogu, w którym umieszczane będą dane z profilera (kalog musi mieć odpowiednie uprawnienia zapisu). Każde wykonanie dowolnego skryptu PHP spowoduje wygenerowanie pliku wynikowego z danymi dla KcacheGrind. Dla ostatniego przykładu:
xdebug

Instalacja KcacheGrind

Pod MS Windows istnieje "wingrind", lecz jest to stara aplikacja i brakuje jej funkcjonalności dostępnej w KCachegrind jak np. wizualizacja zużycia zasobów przez poszczególne bloki kodu. Pod Linuksem i Uniksami Kcachegrind można zainstalowac z repozytorium, jest to aplikacja wchodząca w skład KDE. Jeżeli nie ma oddzielnego pakietu należy zainstalować pakiet kdesdk.

Dla MS Windows należy użyć instalatora aplikacji KDE4 z winkde.org. Pobieramy instalator i przy instalowaniu pakietów wybieramy kdesdk (oraz opcjonalnie pakiet z tłumaczeniami i graphiz).

W przypadku Mac OS X można skorzystać z pakietów dostępnych w repozytorium Fink, czy też Darwin Ports, lub użyć pakietów z KDE 4 Mac (nie testowałem).

blog comments powered by Disqus

Kategorie

Strony