Jaki jest najłatwiejszy sposób na profilowanie skryptu PHP?
Chciałbym dodać coś na ten temat, co pokazuje zrzut wszystkich wywołań funkcji i ile czasu one zajęły, ale nie mam nic przeciwko umieszczeniu czegoś wokół określonych funkcji.
Próbowałem eksperymentować z funkcją microtime :
$then = microtime();
myFunc();
$now = microtime();
echo sprintf("Elapsed: %f", $now-$then);
ale czasami daje to negatywne wyniki. Plus, to jest kłopot, żeby posypać to całym moim kodem.
microtime()
doprowadzi do czasami oceniających wyrażeń takich jak:"0.00154800 1342892546" - "0.99905700 1342892545"
, który oceni jak:0.001548 - 0.999057
. Możesz użyć,microtime( TRUE )
aby uniknąć tego problemu, jak wskazał @luka.Odpowiedzi:
Rozszerzenie PECL APD jest używane w następujący sposób:
Następnie przeanalizuj wygenerowany plik za pomocą
pprofp
.Przykładowe dane wyjściowe:
Ostrzeżenie: najnowsza wersja APD nosi datę 2004 r., Rozszerzenie nie jest już utrzymywane i ma różne problemy ze zgodnością (patrz komentarze).
źródło
pecl install apd
, wyświetla komunikat o błędzie dotyczący „config.m4”. Wygląda na to, że musisz zainstalować go ze źródła, którego jeszcze nie próbowałem. Poważnie, czy nie ma nowoczesnego, zaktualizowanego narzędzia do profilowania opartego na CLI dla PHP, które instaluje się z Homebrew, wymaga minimalnej konfiguracji i daje wyniki łatwe do odczytania przez człowieka?Myślę, że chcesz xdebug . Zainstaluj go na serwerze, włącz, przepompuj dane wyjściowe przez kcachegrind (dla systemu Linux) lub wincachegrind (dla systemu Windows), a pokaże Ci kilka ładnych wykresów, które wyszczególniają dokładne czasy, liczbę i zużycie pamięci (ale będziesz potrzebujesz do tego innego rozszerzenia).
Kołysze poważnie: D
źródło
Nie są potrzebne żadne rozszerzenia, wystarczy użyć tych dwóch funkcji do prostego profilowania.
Oto przykład wywołania prof_flag () z opisem w każdym punkcie kontrolnym i prof_print () na końcu:
Dane wyjściowe wyglądają tak:
Rozpocznij
0,004303
Połącz z DB
0,003518
Wykonaj zapytanie
0,000308
Pobierz dane
0,000009
Zamknij DB
0,000049
Gotowe
źródło
Cross publikowanie mojej referencji z wersji beta Dokumentacji SO, która przechodzi w tryb offline.
Profilowanie za pomocą XDebug
Dostępne jest rozszerzenie PHP o nazwie Xdebug, które pomaga profilować aplikacje PHP , a także debugować środowisko uruchomieniowe. 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. Żadne zmiany kodu aplikacji nie są konieczne do wykonania tego profilowania.
Aby włączyć profilowanie, zainstaluj rozszerzenie i dostosuj ustawienia php.ini. Niektóre dystrybucje Linuksa są dostarczane ze standardowymi pakietami (np.
php-xdebug
Pakiet Ubuntu ). 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.Następnie użyj klienta WWW, aby wysłać zapytanie do adresu URL aplikacji, który chcesz profilować, np
Gdy strona przetwarza, zapisuje do pliku o nazwie podobnej do
Domyślnie liczba w nazwie pliku to identyfikator procesu, który ją napisał. Można to skonfigurować za pomocą tego
xdebug.profiler_output_name
ustawienia.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 czasami łatwiej jest uruchomić curl, aby bezpośrednio POST formularza.
Analiza wyniku
Po napisaniu pamięć podręczna profilu może być odczytana przez aplikację taką jak KCachegrind lub Webgrind . PHPStorm, popularne PHP IDE, może również wyświetlać te dane profilowania .
Na przykład KCachegrind wyświetli informacje, w tym:
Czego szukać
Oczywiście dostrajanie wydajności jest bardzo specyficzne dla przypadków użycia każdej aplikacji. Ogólnie dobrze jest poszukać:
Uwaga : Xdebug, a w szczególności jego funkcje profilowania, bardzo pochłaniają zasoby i spowalniają wykonywanie PHP. Zaleca się, aby nie uruchamiać ich w środowisku serwera produkcyjnego.
źródło
Jeśli odjęcie mikrotimów daje wyniki negatywne, spróbuj użyć funkcji z argumentem
true
(microtime(true)
). Zatrue
pomocą funkcja zwraca liczbę zmiennoprzecinkową zamiast łańcucha (tak jak w przypadku wywołania bez argumentów).źródło
Szczerze mówiąc, zamierzam argumentować, że użycie NewRelic do profilowania jest najlepsze.
Jest to rozszerzenie PHP, które wydaje się wcale nie spowalniać środowiska wykonawczego i monitoruje za Ciebie, umożliwiając przyzwoite drążenie w dół. W drogiej wersji pozwalają one na głębokie drążenie (ale nie możemy sobie pozwolić na ich model wyceny).
Mimo to, nawet w przypadku planu bezpłatnego / standardowego, jest oczywiste i proste, gdzie znajduje się większość nisko wiszących owoców. Podoba mi się również, że może dać ci wyobrażenie o interakcjach DB.
źródło
Profilowanie biednego człowieka, nie wymaga żadnych rozszerzeń. Obsługuje zagnieżdżone profile i procent całości:
Przykład:
Wydajność:
źródło
PECL XHPROF również wygląda intrygująco. Posiada klikalny interfejs HTML do przeglądania raportów i dość prostą dokumentację . Jednak jeszcze go nie przetestowałem.
źródło
Lubię używać phpDebug do profilowania. http://phpdebug.sourceforge.net/www/index.html
Wyprowadza całe użycie czasu / pamięci dla dowolnego użytego SQL, a także wszystkich dołączonych plików. Oczywiście najlepiej działa na abstrakcyjnym kodzie.
Do profilowania funkcji i klas użyję po prostu
microtime()
+get_memory_usage()
+get_peak_memory_usage()
.źródło
Zdecydowanie dałbym szansę BlackFire .
Jest taki VirtualBox , który przygotowałem za pomocą pupppet , aby przetestować różne frameworki php, które są dostarczane z BlackFire, nie krępuj się rozwiązywać i / lub dystrybuować w razie potrzeby :)
https://github.com/webit4me/PHPFrameworks
źródło
Do testów porównawczych, podobnie jak w twoim przykładzie, używam pakietu gruszkowego testu porównawczego . Ustawiasz znaczniki do pomiaru. Klasa zapewnia również kilka pomocników prezentacji lub możesz przetwarzać dane według własnego uznania.
Właściwie mam to zapakowane w innej klasie za pomocą metody __destruct. Kiedy skrypt kończy pracę, dane wyjściowe są logowane przez log4php do syslog, więc mam wiele danych dotyczących wydajności, z których mogę pracować.
źródło
XDebug nie jest stabilny i nie zawsze jest dostępny dla określonej wersji php. Na przykład na niektórych serwerach nadal uruchamiam php-5.1.6, - to jest to, co jest dostarczane z RedHat RHEL5 (i btw wciąż otrzymuje aktualizacje dla wszystkich ważnych problemów), a najnowszy XDebug nawet nie kompiluje się z tym php. Skończyło się na przejściu na debugger DBG. Jego testy porównawcze php zapewniają czas dla funkcji, metod, modułów, a nawet linii.
źródło
Wszyscy powinniście zdecydowanie sprawdzić ten nowy profiler php.
https://github.com/NoiseByNorthwest/php-spx
Redefiniuje sposób, w jaki php profilers zbiera i przedstawia wynik. Zamiast generować tylko całkowitą liczbę poszczególnych wywołań funkcji i całkowity czas jej wykonania - PHP-SPX przedstawia całą oś czasu wykonania żądania w doskonale czytelny sposób. Poniżej znajduje się ekran interfejsu GUI, który zapewnia.
źródło