Menu
Jest wolny
rejestracja
Dom  /  Instalacja i konfiguracja/ Wyimaginowane profile php. Profilowanie i debugowanie aplikacji php za pomocą xhprof

Wyimaginowane profile php. Profilowanie i debugowanie aplikacji php za pomocą xhprof

Profilowanie kodu PHP

Wcześniej czy później każdy z nas ma do czynienia ze starszym kodem i jego optymalizacją. Debuger i profiler w takiej sytuacji - najlepsi pomocnicy programista. Dla tych, którzy pracują z PHP, dzięki Derickowi Rethansowi jest dobre narzędzie - xDebug. Istnieje wiele informacji dotyczących xDebug nawet w runecie, więc ten artykuł nie będzie o tym mówił.

Natknąłem się na wzmiankę o profilerze dla PHP, od razu pomyślałem o xDebug (dawno zapomniałem o autorskich narzędziach Zend), ale tym razem się pomyliłem - porozmawiamy o XHProf.
XHProf

Ten profiler został opracowany specjalnie dla Facebooka i źródło został otwarty w marcu 2009 roku.

Instalacja przebiegła szybko i sprawnie.
wget pecl.php.net/get/xhprof-0.9.2.tgz
tar xvf xhprof-0.9.2.tgz
cd xhprof-0.9.2 / rozszerzenie /
phpize
./configure && make && make install
cd /usr/local/etc/php.d/
vim xhprof.ini
cd / usr / lokalny /
vim header.php
vim footer.php
vim itp / php.ini
/etc/init.d/php-fpm restart
cp vhost.conf.template prof.my.conf
sed -i s / site / prof / prof.my.conf
vim prof.my.conf
/etc/init.d/nginx restart

Przeanalizujmy wspomniane konfiguracje

Xhprof.ini
rozszerzenie = / usr / lokalne / lib / php / rozszerzenia / no-debug-non-zts-20090626 / xhprof.so
xhprof.output_dir = "/home/max/www/profil/"

Prof.my.conf - konfiguracja nginks - najbardziej standardowa.

Serwer (
posłuchaj 80;
nazwa_serwera prof.my;
zestaw znaków utf8;

Katalog główny /usr/local/src/xhprof-0.9.2/xhprof_html;
Lokalizacja / (
indeks index.php;
}

Lokalizacja ~ \ .php $ (
fastcgi_pass 127.0.0.1:12000;
fastcgi_index index.php;
fastcgi_param NAZWA_PLIKU_SKRYPTU /usr/local/src/xhprof-0.9.2/xhprof_html/$fastcgi_nazwa_skryptu;
dołącz fastcgi_params;

/Usr/local/src/xhprof-0.9.2/xhprof_html zawiera źródła PHP, które tworzą ładny WEBGUI dla profilera.

A więc o dwóch głównych plikach:

Nagłówek.php


include_once "/usr/local/src/xhprof-0.9.2/xhprof_lib/utils/xhprof_lib.php";
include_once "/usr/local/src/xhprof-0.9.2/xhprof_lib/utils/xhprof_runs.php";
xhprof_enable (XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
}
}

Footer.php
if (isset ($ _ COOKIE ["xhprof"])) (
if (extension_loaded ("xhprof")) (
$ profiler_namespace = "mojaaplikacja"; // przestrzeń nazw dla twojej aplikacji
$ xhprof_data = xhprof_disable ();
$ xhprof_runs = nowy XHProfRuns_Default ();
$ run_id = $ xhprof_runs-> save_run ($ xhprof_data, $ profiler_namespace);

// url do bibliotek UI XHProf (zmień nazwę hosta i ścieżkę)
$ profiler_url = sprintf ("http://prof.my/index.php?run=%s&source=%s", $ run_id, $ profiler_namespace);
Echo<<Wyjście profilera
NA ZEWNĄTRZ;
}
}

Teraz uruchamiamy dowolny skrypt PHP przez sieć i widzimy w lewym górnym rogu link do wyjścia profilera - do tego właśnie został stworzony host prof.my.

Uwaga - używam weryfikacji dla COOKIE! Dzięki tej weryfikacji możesz bezpiecznie korzystać z profilera na serwerze produkcyjnym - na rzeczywistych danych i na rzeczywistym obciążeniu.

Interfejs sieciowy profilera wyświetla etykiety z informacjami o każdej funkcji i zgłasza następujące informacje:

  • Liczba wywołań każdej funkcji
  • Czas ściany, czas spędzony na wykonywaniu funkcji (w tym oczekiwanie na odpowiedzi z gniazd, systemu plików itp.).
  • Czas procesora, czas spędzony na wykonywaniu funkcji (z wyłączeniem oczekiwania na odpowiedzi z gniazd, systemu plików itp.).
  • Zużycie pamięci
  • Szczytowe wykorzystanie pamięci

Możliwe jest sortowanie tabeli według dowolnego z parametrów

Informacje o każdej funkcji są podzielone na dwa dodatkowe typy Inclusive i Exclusive. Inclusive zawiera cyfry używane przez dzieci, podczas gdy Exclusive nie. Możliwe jest również, klikając w nazwę funkcji, aby zobaczyć tylko informacje o niej oraz o funkcjach, z których została wywołana i które zostały do ​​niej wywołane.

Jeśli GraphViz jest zainstalowany w systemie, profiler narysuje dla Ciebie wykres połączeń.

PS Bez łamania tradycji: to mój pierwszy post na habr.

UPD: odśwież w PHP.

Za pomocą systemów profilowania można zbierać informacje o tym, które funkcje w kodzie php zużywają więcej czasu procesora i pamięci RAM, czyli identyfikować najwolniejsze i najbardziej obciążające pamięć miejsca w programie php.

xhprof

XHPof - profiler PHP opracowany przez Facebook.

Instalacja:

Aptitude zainstaluj php-pear pecl zainstaluj xhprof-0.9.4 echo "extension = xhprof.so"> /etc/php5/mods-available/xhprof.ini ln -s /etc/php5/mods-available/xhprof.ini / etc /php5/conf.d/xhprof.ini restart Apachectl

Pliki wymagane do pracy znajdują się w katalogu / usr / udostępnij / php... Jednak nie wszystkie, ale tylko z kodem php. Do prawidłowego wyświetlania raportów wymagane są jquery i css. Można je pobrać z repozytorium na github:

Klon Gita https://github.com/facebook/xhprof.git

Następnie dodaj linię do kodu php-script w miejscu, w którym powinno rozpocząć się zbieranie danych:

Xhprof_enable (XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);

Parametry do zbierania danych są podane w nawiasach. W takim przypadku zbierane będą dane o obciążeniu procesora i wykorzystaniu pamięci RAM. Możliwy jest jeszcze jeden parametr XHPROF_FLAGS_NO_BUILTINS podczas korzystania z których dane dotyczące funkcji wbudowanych nie są gromadzone.

$ xhprof_data = xhprof_disable (); include_once "xhprof_lib / utils / xhprof_lib.php"; include_once "xhprof_lib / utils / xhprof_runs.php"; $ xhprof_runs = nowy XHProfRuns_Default (); $ run_id = $ xhprof_runs-> save_run ($ xhprof_data, "xhprof_test"); echo "Raport: http://domain.tld/xhprof_html/index.php? run = $ run_id & source = xhprof_test"; echo "\ n";

W kolejce $ run_id cudzysłowy wskazują nazwę profilu, którą można ustawić dowolnie.

Przetworzony wynik wygląda tak:

Jeśli określisz parametr XHPROF_FLAGS_NO_BUILTINS, widać, że liczba wywołań funkcji jest znacznie zmniejszona:

Tabela zawiera następujące informacje:

Połączenia- ilość wywołań funkcji,
Czas na ścianie- łączny czas działania funkcji, w tym czas oczekiwania na odpowiedź z zasobów zewnętrznych,
Procesor- ile czasu poświęcono na funkcje przetwarzania,
MemUżyj- ile pamięci RAM zostało wykorzystane,
PeakMemUżyj- szczytowe zużycie pamięci.

Modyfikatory to:

w tym- włącznie - z uwzględnieniem wywołań innych funkcji z tej funkcji,
Bez- Exclusive - wyłączając wywołania funkcji.

Dodatkowo nad tabelą przedstawiono informacje o całkowitym czasie przetwarzania, wykorzystanej pamięci oraz liczbie wywołań funkcji.

Także XHProf umożliwia budowanie raportów różnicowych między dwoma przebiegami, które są oznaczone kolorem czerwonym i zielonym. Dzięki tym raportom możesz uzyskać jasny obraz ulepszeń po każdej zmianie kodu.

Aby otrzymać taki raport, musisz skorzystać z linku formularza:

http://domain.tld/xhprof_html/index.php?run1 = run_id1 & run2 = run_id2 & source = xhprof_test

gdzie run_id1 oraz run_id2- identyfikatory uruchamiania.

Jeśli zainstalujesz Graphviz:

aptitude zainstalować graphviz

Również dla php profilera xhprof istnieją interfejsy sieciowe innych firm korzystające z baz danych:

xDebug

xDebug to profilujący debugger kodu PHP napisany przez Dericka Rethansa.

Instalacja:

Mniam zainstaluj php5-xdebug

Następnie edytujemy konfigurację:

Nano /etc/php5/mods-available/xdebug.ini

dodanie do niego linii:

Xdebug.profiler_enable = 1 xdebug.profiler_aggregate = Wł. xdebug.profiler_output_dir = / tmp

Tutaj włączamy profiler PHP i określamy katalog, w którym mają być umieszczone profile. Profile są tworzone o nazwach takich jak cachegrind.out *

Istnieje klient sieciowy webgrind: https://github.com/jokkedk/webgrind. Nie działa bardzo szybko, ale pozwala na szybkie przeglądanie małych profili. W rzeczywistości jest to kod PHP, który należy sklonować z github:

Klon Gita https://github.com/jokkedk/webgrind.git

zostanie utworzony katalog webgrind, który musisz skopiować do katalogu dowolnej witryny i uzyskać do niego dostęp z przeglądarki. Ponadto, aby wykresy w pliku konfiguracyjnym działały w Debianie config.php musisz poprawić ścieżkę do pliku wykonywalnego grafiz... To powinno wyglądać tak:

Static $ dotExecutable = "/ usr / bin / kropka";

Dodatkowo możesz poprawić strefę czasową:

Statyczny $ defaultTimezone = "Europa / Moskwa";

W nagłówku możesz wybrać profil i zaznaczyć pole, czy uwzględniać wbudowane funkcje. W samej tabeli możesz zobaczyć funkcje, liczbę połączeń, czas działania samej funkcji oraz czas z uwzględnieniem czasu oczekiwania. Aby zagłębić się w funkcje, wystarczy kliknąć trójkątną strzałkę. W moim przypadku przy odpowiednio dużych profilach (od kilku megabajtów) oczekiwanie wyniku było niepotrzebnie wysokie. Prawdopodobnie w przypadku wystarczająco dużych profili lepiej korzystać z lokalnych programów przeglądarek.

Wykres może wyglądać tak:

zauważ, że webgrind nie powinien być używany na serwerach produkcyjnych, ponieważ nie jest udzielana autoryzacja, ale jednocześnie jest dostęp do kodu plików w php. Jeśli to konieczne, użyj co najmniej podstawowej autoryzacji Apache.

Są też programy do analizy profili jak pod Linuksem:

O profilowaniu

Dane profilu mogą pomóc w ulepszeniu aplikacji, czyli osiągnięciu określonych celów, na przykład zmniejszeniu zużycia pamięci, skróceniu czasu generowania strony i tak dalej.

Informacje w profilu są punktem wyjścia do optymalizacji: mówią, jak długo generowany jest wynik, ile pamięci jest używane i ile wywołań funkcji. Mając bardziej szczegółowe dane, możesz poprawić te wskaźniki.

Na przykład, jeśli używasz frameworka, użycie niektórych funkcji frameworka może spowodować wywołanie kilku podstawowych funkcji. Jeśli kilka razy czytasz jakieś dane, warto zapisać wynik w zmiennej.

Profiler może również pomóc w zrozumieniu, gdzie używać buforowania PHP, na przykład używając APCu lub memcached.

Przede wszystkim warto zoptymalizować funkcje, których wykonanie zajmuje najwięcej czasu. Po tym, jak wszystko jest zoptymalizowane i wydaje się, że nie ma już nic do poprawienia, warto posortować funkcje po liczbie wywołań i popracować nad jej obniżeniem. Nawet jeśli PHP jest szybkie, warto zastanowić się, czy nie trzeba tak często wywoływać funkcji?

Gdy napotkasz następujące sytuacje, warto rozważyć buforowanie:

  • Wewnątrz pętli wywoływane są funkcje niezmienne,
  • Niektóre treści są generowane dwukrotnie,
  • Treść, która się nie zmienia, jest generowana za każdym razem,
  • Treść jest generowana, nawet jeśli nie jest używana.

Nie powinieneś buforować wszystkiego, ponieważ pamięć jest również cennym zasobem. Buforuj dane, do których stale uzyskujesz dostęp. Ponadto buforowanie nie ma sensu, jeśli buforowanie marnuje więcej zasobów niż oszczędza.

Oprócz buforowania w kodzie nie zapomnij o buforowaniu za pomocą serwera WWW (), a także po stronie klienta. Używając poprawnych nagłówków, wiele żądań może zostać rozwiązanych, zanim dotrą do serwera.

Z biegiem czasu każdy programista PHP staje przed problemem słabej wydajności swojej aplikacji. Może to być powolne ładowanie określonej strony lub zbyt długa odpowiedź z interfejsu API. A czasami dość trudno zrozumieć, co jest przyczyną hamulców? Czasami zdarzają się trudniejsze sytuacje: na serwerze produkcyjnym api działa bardzo wolno, ale na stanowisku, na którym odbywa się rozwój, wszystko jest w porządku. I idź dowiedzieć się, co się dzieje. Debugowanie na serwerze produkcyjnym to skrajna rozpacz, którą oczywiście najlepiej pozostawić bez kontroli.

To dla takich sytuacji wymyślono specjalne narzędzia zwane profilerami aplikacji. W świecie PHP taką rolę pełni xDebug oraz xhprof. xhprof jest lżejszym, prostszym i bardziej elastycznym narzędziem i dlatego jest preferowany. Co ciekawe, xhprof został opracowany przez Facebooka w 2009 roku, jednak nadal nie ma oficjalnego wsparcia dla php7 i nie będzie już od czasu przejścia Facebooka na HHVM. Jednak dzięki dużej społeczności programistów php pojawił się widelec obsługujący php7, którego instalacja nie sprawia żadnych trudności.

Instalacja

Najpierw musisz faktycznie zainstalować xhprof:

Klon Gita https://github.com/longxinH/xhprof xhprof cd xhprof / extension phpize ./configure --with-php-config = / usr / bin / php-config sudo make && sudo make install mkdir / var / tmp / xhprof

Rozszerzenie = xhprof.so xhprof.output_dir = "/ var / tmp / xhprof"

Folder / var / tmp / xhprof musi mieć dostęp do zapisu, ponieważ tam zostaną zapisane wyniki profilowania.

Możesz ponownie załadować PHP-FPM i sprawdzić, czy rozszerzenie jest zainstalowane. To banalne, można to zrobić za pomocą wyjścia funkcji phpinfo ();

xhprof jest zainstalowany, możesz go użyć. Pakiet xhprof zawiera bardzo przyjazny dla użytkownika interfejs do analizy raportów profilowania. xhprof umożliwia budowanie raportów zarówno w formie tekstowej jak i graficznej. Folder instalacyjny xhprof zawiera potrzebne nam pliki xhprof_html i xhprof_lib. Folder Xhprof_html — zapewnia dostęp do GUI. xhprof_lib to biblioteka do wyświetlania i analizowania kodu. Wskazane jest przeniesienie całego folderu xhprof do /var/www/xhprof i skonfigurowanie dla niego wirtualnego hosta, na przykład xhprof.loc. Przykład dla nginx:

Serwer (listen 80; nazwa_serwera xhprof.loc; charset utf-8; root / var / www / xhprof / xhprof_html; index.php; lokalizacja / (try_files $ uri $ uri / /index.php?q=$uri&$args ;) lokalizacja ~ \ .php (fastcgi_pass 127.0.0.1:9000; fastcgi_split_path_info ^ (. + \. php) (/.+) $; fastcgi_param NAZWA_PLIKU_SKRYPTU $ document_root $ fastcgi_script_name; include fastcgi_params;))

Musisz również pamiętać o aktualizacji pliku hosts. Teraz, gdy wprowadzimy do przeglądarki adres URL xhprof.loc, zostaniemy przeniesieni do interfejsu sieciowego profilera, gdzie uzyskamy dostęp do generowanych przez niego plików.

Teraz możesz zacząć bezpośrednio profilować swój kod.

Aby włączyć profiler, użyj funkcji xhprof_enable(), która przyjmuje następujące flagi jako dane wejściowe:

  • XHPROF_FLAGS_CPU - do naprawy statystyk procesora;
  • XHPROF_FLAGS_MEMORY - dla pamięci;
  • XHPROF_FLAGS_NO_BUILTINS - aby zignorować wbudowane funkcje.

Aby wyłączyć profiler, użyj funkcji xhprof_disable(). Dla wygody napiszmy dwa skrypty header.php i footer.php, które realizują te funkcje. header.php znajduje się na początku skryptu profilowanego, a footer.php znajduje się na końcu. footer.php zajmuje się również zapisywaniem danych profilowania.

header.php: if (extension_loaded ("xhprof")) (include_once "/var/www/xhprof/xhprof_lib/utils/xhprof_lib.php"; include_once "/var/www/xhprof/xhprof_lib/utils/xhpprof_runs.php (xhprof XHPROF_FLAGS_CPU);) footer.php: if (extension_loaded ("xhprof")) ($ profilerNamespace = "PROFILED_SCRIPT_NAME_ TUTAJ"; $ xhprofData = xhprof_shprofRunIsable (); ($ xhprofData, $ profilerNamespace);)
Stosowanie

Po połączeniu header.php i footer.php ze skryptem profilowanym można rozpocząć: po wykonaniu skryptu profilowanego zostanie wygenerowany plik, który zostanie zapisany w katalogu /var/tmp/xhprof zawierającym informacje o działaniu skryptu. Po otwarciu interfejsu internetowego xhprof.loc ten wygenerowany plik będzie dostępny:


Po otwarciu pliku profilowania pojawiają się szczegółowe informacje o działaniu aplikacji, cały stos wywołań:


Co oznaczają kolumny:

  • Połączenia- liczba i procent wywołań funkcji;
  • W tym Czas na ścianie- czas wykonania funkcji z funkcjami zagnieżdżonymi;
  • Wył. Czas na ścianie- czas wykonania funkcji bez funkcji zagnieżdżonych;
  • W tym Procesor- czas procesora z zagnieżdżonymi funkcjami;
  • Wył. Procesor- Czas procesora bez funkcji zagnieżdżonych;
  • W tym MemUżyj- zużycie pamięci z zagnieżdżonymi funkcjami;
  • Wył. MemUżyj- zużycie pamięci bez funkcji zagnieżdżonych;
  • W tym PeakMemUżyj- maksymalne zużycie pamięci z zagnieżdżonymi funkcjami;
  • Wył. PeakMemUżyj- maksymalne zużycie pamięci bez funkcji zagnieżdżonych.

Jeśli klikniesz w link, zobaczysz piękne drzewo połączeń z wizualnym wskazaniem najbardziej zablokowanego kodu. Jeśli tak się nie stało, najprawdopodobniej musisz zainstalować bibliotekę graphviz:

Apt-get install graphviz

Przykład wykreślonego wykresu:

W moim przypadku wąskim gardłem jest interakcja z bazą danych.


Korzystanie z xhprof na serwerze produkcyjnym

Początkowo xhprof został opracowany specjalnie na potrzeby profilowania kodu w bitwie na serwerach produkcyjnych. Po prostu nie ma innego darmowego i skutecznego narzędzia do profilowania kodu php7 w walce, więc xhprof nie ma konkurencji. W szczególności mam doświadczenie w używaniu xhprof na serwerze produkcyjnym, który przetwarza milion żądań dziennie. Używa php7 i nie znaleziono jeszcze żadnych problemów. Jednak xhprof nie jest uruchamiany dla każdego żądania - wygenerowanych zostanie zbyt wiele plików profilowania. Mój profiler uruchamia się tylko wtedy, gdy żądanie zawiera nagłówek „XHPROF_ENABLE” i jest ustawiony na wartość true. Możesz także użyć innej strategii, na przykład losowo uruchomić profiler z prawdopodobieństwem powiedzmy 1/1000. Wtedy obraz też będzie wystarczająco wyraźny.


Wyjście

Mimo że xhprof nie jest oficjalnie obsługiwany przez php7, nadal pozostaje niezbędnym narzędziem dla programistów php.

Dostępne jest rozszerzenie PHP o nazwie Xdebug, które pomaga w profilowaniu aplikacji PHP oraz debugowaniu w czasie wykonywania. Podczas uruchamiania profilera dane wyjściowe są zapisywane w pliku w formacie binarnym o nazwie "cachegrind". Na każdej platformie dostępne są aplikacje do analizy tych plików. Do wykonania tego profilowania nie są konieczne żadne zmiany kodu aplikacji.

Aby włączyć profilowanie, zainstaluj rozszerzenie i dostosuj ustawienia php.ini. Niektóre dystrybucje Linuksa są dostarczane ze standardowymi pakietami (np. pakiet php-xdebug Ubuntu). W naszym przykładzie opcjonalnie uruchomimy profil w oparciu o parametr żądania. Dzięki temu możemy zachować ustawienia statyczne i włączyć profiler tylko w razie potrzeby.

# Ustawienia php.ini # Ustaw na 1, aby włączyć go dla każdego żądania xdebug.profiler_enable = 0 # Użyjmy parametru GET / POST, aby włączyć profiler xdebug.profiler_enable_trigger = 1 # Przekażemy wartość GET / POST puste dla dowolnej wartości xdebug.profiler_enable_trigger_value = "" # Wysyłaj pliki cachegrind do /tmp, aby nasz system wyczyścił je później xdebug.profiler_output_dir = "/ tmp" xdebug.profiler_output_name = "cachegrind.out.% p"

Następnie użyj klienta WWW, aby wysłać żądanie do adresu URL aplikacji, który chcesz profilować, np.

Http://example.com/artykul/1?XDEBUG_PROFILE=1

Podczas przetwarzania strona zapisze do pliku o nazwie podobnej do

/tmp/cachegrind.out.12345

Domyślnie numer w nazwie pliku to identyfikator procesu, który go napisał. Można to skonfigurować za pomocą ustawienia xdebug.profiler_output_name.

Zauważ, że zapisze jeden plik dla każdego żądania / procesu PHP, który jest wykonywany. Na przykład, jeśli chcesz przeanalizować wpis w formularzu, jeden profil zostanie napisany 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 formularz.

Analiza wyników

Po zapisaniu pamięć podręczna profili może być odczytana przez aplikację taką jak Webgrind. PHPStorm, popularne środowisko PHP IDE, może również wyświetlać te dane profilowania.

Na przykład KCachegrind wyświetli informacje, w tym:

  • Wykonywane funkcje
  • Czas wywołania, zarówno sam, jak i kolejne wywołania funkcji
  • Ile razy każda funkcja jest wywoływana
  • Wykresy połączeń
  • Linki do kodu źródłowego

Czego szukać

Oczywiście dostrajanie wydajności jest bardzo specyficzne dla przypadków użycia każdej aplikacji. Ogólnie dobrze jest poszukać:

  • Powtarzające się wywołania tej samej funkcji, których nie spodziewałbyś się zobaczyć. W przypadku funkcji przetwarzających i wysyłających zapytania do danych może to być najlepsza okazja do buforowania aplikacji.
  • Wolno działające funkcje. Gdzie aplikacja spędza większość czasu? najlepszą wypłatą w dostrajaniu wydajności jest skupienie się na tych częściach aplikacji, które pochłaniają najwięcej czasu.

Notatka: Xdebug, aw szczególności jego funkcje profilowania, wymagają dużej ilości zasobów i spowalniają wykonywanie PHP. Zaleca się, aby nie uruchamiać ich w środowisku serwera produkcyjnego.

FirePHP to rozszerzenie dla firebug, które w połączeniu ze swoją klasą small php pozwala na przesyłanie danych z php do konsoli firebug, takich jak var_dump i inne informacje dotyczące debugowania, nagłówki i nie zaśmiecają stron i nie łamią logiki aplikacji w jakikolwiek sposób. Oficjalna strona: http://firephp.org/.

Główny pomysł.

Ogólny algorytm profilowania wygląda następująco:
  1. Na początku strony włącz profilowanie za pomocą xhprof_enable()
  2. Na końcu strony wyłącz profilowanie za pomocą xhprof_disable() i zapisz zebrane dane za pomocą save_run()
  3. Następnie za pomocą klasy firephp php przekazujemy link do danych profilowania po stronie klienta
  4. W konsoli Firebug "i otwórz potrzebne nam informacje
  5. Jesteśmy szczęśliwi :)
Chciałbym również powiedzieć, że oczywiście ręczne dodawanie tych funkcji do skryptów php jest świetne. Ale chcę, aby te informacje były zawsze pod ręką podczas tworzenia, a jednocześnie nie trafiały na serwery bojowe. Rozwiązujemy ten problem w następujący sposób:

W naszych projektach, w prawie wszystkich skryptach, na początku podłączany jest działający plik z loaderem klas, łączącymi funkcje i innymi niezbędnymi rzeczami. Dlatego przenieśliśmy włączenie profilowania do tego pliku. Aby móc dowolnie włączać / wyłączać tryb debugowania, dodaliśmy sprawdzenie stałej konfiguracji, a ponadto umieściliśmy te sprawdzenia w niektórych metatagach, które są automatycznie usuwane podczas kompilowania projektu. To samo dotyczy wyłączenia profilowania i zapisywania informacji do nagłówków za pomocą firephp - te zadania są rozwiązywane przez jedną funkcję, która jest wywoływana na końcu każdego skryptu php i jest również opakowana w metatagi. To wygląda tak:

// Te stałe są zapisywane w pliku konfiguracyjnym aplikacji

/ ** Tryb pracy otoczenia * * /
zdefiniuj ("APPLICATION_ENV", "dev"); // dev - debugowanie | pro - produkcja
/ ** Ścieżka do profilera * /
zdefiniuj ("XHPROF_ROOT", __DIR__. "/ExtProcs/debug/xhprof-0.9.2");

/***************************************************************************************
* Następnie w pliku ładowanym na początku każdego skryptu uruchamiamy profilowanie
* DEV_START i DEV_END to nasze metatagi, wszystko pomiędzy nimi jest wycinane podczas montażu
***************************************************************************************/

// - DEV_START
// - w trybie debugowania podłącz biblioteki debugowania

// Załaduj firephp
wymagać_raz (__ DIR__. "/includes/ExtProcs/debug/firephp/FirePHP.class.php");
// - załaduj profiler
„/xhprof_lib/utils/xhprof_lib.php”);
wymagać_raz (XHPROF_ROOT. "/xhprof_lib/utils/xhprof_runs.php");
// Zainicjuj profilowanie z wymaganymi flagami. Szczegółowy opis flag
// można znaleźć na php.net/manual/ru/xhprof.constants.php
xhprof_enable (XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
}
// - DEV_END

// Cóż, ta funkcja jest wywoływana na końcu każdego skryptu
// Jego wywołanie jest również opakowane w DEV_START i DEV_END

/**
* Utwórz link do wyniku profilowania i wyślij go do konsoli
*/
funkcja dev_boot_Down () (
if (APPLICATION_ENV === "dev") (
// Zainicjuj instancję Firephp
$ firephp = FirePHP :: getInstance (prawda);
// Wyłącz profilowanie i zapisz dane
$ xhprof_data = xhprof_disable ();
$ xhprof_runs = nowy XHProfRuns_Default ();
$ run_id = $ xhprof_runs-> save_run ($ xhprof_data, "xhprof_testing");
// Utwórz link do danych profilowania i zapisz go w konsoli
$ link = "http: //". $ _SERVER ["HTTP_HOST"]. "/includes/ExtProcs/debug/xhprof-0.9.2/xhprof_html/index.php?run=($run_id)&source=xhprof_testing\n";
$ firephp-> info ($ link, "profilowanie danych");
}
}


* Ten kod źródłowy został wyróżniony za pomocą narzędzia do podświetlania kodu źródłowego.

Nie będę wchodzić w szczegóły instalacji tych rozszerzeń, bo tutaj wszystko jest proste. Powiem tylko o niektórych punktach konfiguracji. Xhproof udostępnia tylko jedną zmienną konfiguracyjną, xhprof.output_dir, która wskazuje na folder, w którym zostaną zapisane dane profilowania. Dlatego upewnij się, że użytkownik, pod którym wykonywane są skrypty php ma uprawnienia do zapisu do określonego katalogu. Więc umieść coś takiego w swoim php.ini:


rozszerzenie = xhprof.so
xhprof.output_dir = "/ var / tmp / xhprof"

Nie jest też źle umieścić coś takiego jak kropka lub Graphviz do rysowania wykresów połączeń. Mam Graphviz pod MacOS X.

Po wykonaniu powyższych procedur mogliśmy w dowolnym momencie otworzyć i przyjrzeć się profilowaniu dowolnego z naszych skryptów bezpośrednio w przeglądarce.