Szukaj…
Profilowanie za pomocą XHProf
XHProf to profiler PHP napisany pierwotnie przez Facebooka, który stanowi bardziej lekką alternatywę dla XDebug.
Po zainstalowaniu modułu xhprof
PHP profilowanie można włączyć / wyłączyć z kodu PHP:
xhprof_enable();
doSlowOperation();
$profile_data = xhprof_disable();
doSlowOperation()
tablica będzie zawierać dane o liczbie wywołań, czasie pracy procesora i zużyciu pamięci przez każdą funkcję, do której dostęp doSlowOperation()
w doSlowOperation()
.
xhprof_sample_enable()
/ xhprof_sample_disable()
może być użyte jako bardziej lekka opcja, która będzie rejestrować informacje profilujące tylko dla części ułamków żądań (w innym formacie).
XHProf ma niektóre (najczęściej nieudokumentowane) funkcje pomocnicze do wyświetlania danych ( patrz przykład ) lub możesz użyć innych narzędzi do ich wizualizacji (blog platform.sh ma przykład ).
Zużycie pamięci
Limit pamięci środowiska wykonawczego PHP jest ustalany w dyrektywie INI memory_limit
. To ustawienie zapobiega zużyciu zbyt dużej ilości pamięci przez dowolne wykonanie PHP, co wyczerpuje ją dla innych skryptów i oprogramowania systemowego. Domyślny limit pamięci to 128 MB i można go zmienić w pliku php.ini
lub w czasie wykonywania. Można go ustawić tak, aby nie miał limitu, ale jest to ogólnie uważane za złą praktykę.
Dokładne użycie pamięci podczas pracy można ustalić, wywołując memory_get_usage()
. Zwraca liczbę bajtów pamięci przydzielonej do aktualnie działającego skryptu. Począwszy od PHP 5.2, ma jeden opcjonalny parametr boolowski, aby uzyskać całkowitą przydzieloną pamięć systemową, w przeciwieństwie do pamięci aktywnie wykorzystywanej przez PHP.
<?php
echo memory_get_usage() . "\n";
// Outputs 350688 (or similar, depending on system and PHP version)
// Let's use up some RAM
$array = array_fill(0, 1000, 'abc');
echo memory_get_usage() . "\n";
// Outputs 387704
// Remove the array from memory
unset($array);
echo memory_get_usage() . "\n";
// Outputs 350784
Teraz memory_get_usage
zapewnia użycie pamięci w momencie jej uruchomienia. Pomiędzy wywołaniami tej funkcji możesz przydzielać i zwalniać inne rzeczy w pamięci. Aby uzyskać maksymalną ilość pamięci używaną do pewnego momentu, wywołaj memory_get_peak_usage()
.
<?php
echo memory_get_peak_usage() . "\n";
// 385688
$array = array_fill(0, 1000, 'abc');
echo memory_get_peak_usage() . "\n";
// 422736
unset($array);
echo memory_get_peak_usage() . "\n";
// 422776
Zauważ, że wartość wzrośnie lub pozostanie stała.
Profilowanie za pomocą Xdebug
Dostępne jest rozszerzenie PHP o nazwie Xdebug, które pomaga w profilowaniu aplikacji PHP , a także w debugowaniu środowiska uruchomieniowego. Po uruchomieniu profilera dane wyjściowe są zapisywane w pliku w formacie binarnym o nazwie „cachegrind”. Aplikacje są dostępne na każdej platformie do analizy tych plików.
Aby włączyć profilowanie, zainstaluj rozszerzenie i dostosuj ustawienia php.ini. W naszym przykładzie profil zostanie uruchomiony opcjonalnie na podstawie parametru żądania. Pozwala nam to zachować ustawienia statyczne i włączyć profiler tylko w razie potrzeby.
// Set to 1 to turn it on for every request
xdebug.profiler_enable = 0
// Let's use a GET/POST parameter to turn on the profiler
xdebug.profiler_enable_trigger = 1
// The GET/POST value we will pass; empty for any value
xdebug.profiler_enable_trigger_value = ""
// Output cachegrind files to /tmp so our system cleans them up later
xdebug.profiler_output_dir = "/tmp"
xdebug.profiler_output_name = "cachegrind.out.%p"
Następnie użyj klienta WWW, aby wysłać zapytanie o adres URL aplikacji, którą chcesz profilować, np
http://example.com/article/1?XDEBUG_PROFILE=1
Gdy strona przetwarza, zapisuje do pliku o nazwie podobnej do
/tmp/cachegrind.out.12345
Zauważ, że zapisze jeden plik dla każdego wykonywanego żądania / procesu PHP. Na przykład, jeśli chcesz przeanalizować post formularza, zostanie napisany jeden profil dla żądania GET, aby wyświetlić formularz HTML. Parametr XDEBUG_PROFILE będzie musiał zostać przekazany do kolejnego żądania POST, aby przeanalizować drugie żądanie, które przetwarza formularz. Dlatego podczas profilowania czasem łatwiej jest uruchomić curl, aby bezpośrednio POST formularza.
Po napisaniu pamięć podręczna profilu może być odczytana przez aplikację taką jak KCachegrind.
Spowoduje to wyświetlenie informacji, w tym:
- Funkcje wykonane
- Czas wywołania, zarówno sam, jak i kolejne wywołania funkcji
- Liczba wywołań każdej funkcji
- Wykresy połączeń
- Linki do kodu źródłowego
Oczywiście dostrajanie wydajności jest bardzo specyficzne dla przypadków użycia każdej aplikacji. Ogólnie dobrze jest poszukać:
- Powtarzane połączenia z tą samą funkcją, której nie spodziewałbyś się zobaczyć. W przypadku funkcji przetwarzających i wyszukujących dane mogą to być najważniejsze możliwości buforowania aplikacji.
- Funkcje wolno działające. Gdzie aplikacja spędza większość czasu? najlepsza wypłata w zakresie dostrajania wydajności koncentruje się na tych częściach aplikacji, które zużywają najwięcej czasu.
Uwaga : Xdebug, a w szczególności jego funkcje profilowania, wymagają bardzo dużo zasobów i spowalniają wykonywanie PHP. Zaleca się, aby nie uruchamiać ich w środowisku serwera produkcyjnego.