Profilisanje PHP koda. Profilisanje PHP-a sa XHprof-om Analiza opisa dnevnika profilisanja

Pokazao je kako instalirati i konfigurirati xdebug, a pokrio je i neke osnovne karakteristike, kao što je poboljšanje izlaza funkcije var_dump() ili štampanje traga steka poziva kada se primi poruka o grešci. U drugom dijelu pogledali smo ovu funkciju xdebug kao praćenje. Praćenje sadrži sve pozive funkcijama i metodama u programu, vrijeme pokretanja, opcionalno veličinu memorije, proslijeđene i vraćene parametre. Dnevnik praćenja može vam pomoći da shvatite putanju izvršavanja složenog programa. Umjesto umetanja koda za otklanjanje grešaka unutar programa, uključujete ili isključujete praćenje gdje je potrebno, a zatim koristite uslužne programe kao što su grep ili vlastite PHP aplikacije za analizu datoteke evidencije.

U ovom članku ćemo pogledati profilisanje. Na prvi pogled, profiliranje je slično praćenju. Dnevnik profiliranja nije namijenjen ljudima, nije namijenjen za vizualizaciju toka programa, ali nam pruža podatke za statističku analizu pokrenutog programa.

Kreiranje dnevnika profilisanja

Ispod je kratak izvod iz dnevnika profilisanja koji je generisao xdebug:

fl=php:interna
fn=php::define
106 3

Fl=C:\www\drupal\includes\bootstrap.inc
fn=require_once::C:\www\drupal\includes\bootstrap.inc
1 648
cfn=php::define
pozivi=1 0 0
13 6
cfn=php::define
pozivi=1 0 0
18 4
cfn=php::define
pozivi=1 0 0
23 2


Kao što vidite, dnevnik profilisanja se ne može čitati direktno. Koristićemo dodatne alate za vizualizaciju i analizu dobijenih podataka. Dakle, profiliranje pokazuje koliko je puta određena linija pokrenuta i koliko je dugo trajalo lansiranje.
Kreiranje dnevnika profiliranja uvelike degradira performanse, slično kreiranju dnevnika praćenja, jer morate opisati prolaz svake linije. Stoga, baš kao iu slučaju praćenja, nemojte pokretati profilisanje na proizvodnim serverima... Međutim, postoje slučajevi kada je profilisanje potrebno pokrenuti na živom sistemu. U ovom slučaju, budite oprezni oko pokretanja xdebug-a istovremeno s drugim Zend ekstenzijama, kao što su loaderi, optimizatori ili keš memorije.
Da bi xdebug počeo snimati dnevnike profiliranja, dodajte

Imajte na umu da ne možete pokrenuti profilisanje u vrijeme pokretanja pokretanjem naredbe.
Budući da je dnevnik profiliranja namijenjen za čitanje od strane programa analizatora, nema dodatnih postavki koje vam omogućavaju da prikažete dodatne informacije, kao što je slučaj sa evidencijom praćenja. Međutim, postoje neke postavke koje vam omogućavaju da konfigurirate profiliranje, slično onima koje smo koristili prilikom postavljanja praćenja.
Prvo, xdebug po defaultu zapisuje dnevnik profiliranja u /tmp direktorij. Ako koristite Windows, morate popraviti php.ini, ovako:
xdebug.profiler_output_dir="c:\traces"

Podrazumevano, xdebug prepisuje postojeći dnevnik profilisanja. Možete ga konfigurirati tako da dopuni postojeći dodavanjem sljedeće naredbe

u php.ini. Postoje slučajevi u kojima ne želite da kreirate dnevnik profilisanja za sve datoteke, ali je istovremeno aktiviranje profilisanja u toku rada problematično. Umjesto povremenog uključivanja i isključivanja profiliranja, dodajte naredbu
xdebug.profiler_enable_trigger=Uključeno

u php.ini. Sada možete uključiti i isključiti profiliranje tako što ćete u PHP skriptu proslijediti poseban GET ili POST parametar XDEBUG_PROFILE. Ovo će omogućiti profilisanje samo za ovu PHP skriptu. Nije potrebno postavljati vrijednost ovog parametra, samo zapamtite da dodate ovaj parametar u adresu test.php?XDEBUG_PROFILE.

Ime dnevnika profilisanja

Ime koje xdebug dodeljuje dnevniku profilisanja prema zadanim postavkama je “cachegrind.out”. plus identifikator procesa. Baš kao iu slučaju evidencije praćenja, možete promijeniti nazive dnevnika dodavanjem odgovarajućih postavki u php.ini. Ime parametra xdebug.profiler_output_name. Argument je niz. koji mogu sadržavati različite modifikatore. Najvažnije su u nastavku:

  • %p – identifikator procesa
  • %r – slučajni broj
  • %u - vrijeme
  • %H – vrijednost $_SERVER["HTTP_HOST"]
  • %R – vrijednost $_SERVER["REQUEST_URI"]
  • %s – ime uključujući punu putanju, kose crte se pretvaraju u donje crte
Imajte na umu da se modifikator %s koristi samo za xdebug.profiler_output_name. Ako želite da znate ime dnevnika profilisanja, možete pozvati funkciju xdebug_get_profiler_filename().

Analiza dnevnika profilisanja
Kao što je već spomenuto, za analizu dnevnika profiliranja potrebni su dodatni programi za vizualizaciju podataka. Svi dnevnici profiliranja koje xdebug kreira su u formatu sličnom Cachegrind formatu. Cachegrind je profiler koji je dio moćnijeg programa pod nazivom Valgrind, programa za otklanjanje grešaka i profiliranje softvera za Linux. Cachegrind je dizajniran za analizu statistike keš memorije, upotrebe memorije i programskih naredbi. Drugi Valgrind alat, Callgrind, crta grafove poziva. Što se tiče PHP-a, ovu aplikaciju možemo koristiti za vizualizaciju i analizu dnevnika profiliranja.
Alat koji se obično koristi za analizu dnevnika profiliranja koji generiše xdebug zove se . KCachegrind je besplatni softver licenciran pod GPL (radi samo na Unix sistemima). Međutim, postoji jednostavan program za Windows, koji je također besplatan. Pogledajmo prvo verziju Windows-a.

WinCacheGrind: analiza dnevnika profilisanja u Windows-u

Trenutna verzija (u vrijeme pisanja od strane autora ovog članka) WinCachegrind-a je 1.0.0.12. Ova verzija datira iz 2005. godine, što znači da WinCachegrind nije razvijen dugo vremena. Ako pogledate napomene o izdanju, autori pišu da program ima greške zbog kojih se ponekad ponaša čudno.
Stoga preporučujem korištenje KCachegrind-a, pokrenutog na bazi virtuelne mašine na najnovijoj Linux distribuciji, na primjer Ubuntu (napomena prevoditelja, općenito govoreći, čudna preporuka; u ovom slučaju bih preporučio samo instaliranje Linuxa, a ne ograđivanje u bašta virtuelnih mašina). Postoji ogroman broj virtuelnih mašina dostupnih pod Windowsom. Ako iz nekog razloga nije moguće koristiti Unix ili virtuelnu mašinu, možete nastaviti da koristite WinCachegrind za jednostavnu analizu dnevnika profilisanja. WinCachegrind ne crta grafove poziva, za razliku od KCachegrind-a.
Instalacija Wincachegrinda je izuzetno jednostavna. Pokrenite instalater, kliknite na dugme da prihvatite licencu i instalacija je završena. Sada možete pokrenuti program i otvoriti jedan od cachegrind dnevnika profiliranja koje je kreirao xdebug.

Klikom na sat ili sigma ikonu možete se prebacivati ​​između prikaza informacija u apsolutnim vrijednostima i procentima. Prikaz postotaka pokazuje koliko je vremena, kao postotak ukupnog vremena, potrebno za pozivanje funkcije u datom bloku.
Dvije korisne postavke su Profiler -> Sakrij brze funkcije i Profiler -> Sakrij funkcije biblioteke. Prvi prekidač skriva funkcije čiji je vremenski doprinos ukupnom vremenu izvršavanja programa beznačajan.
Druga postavka, Profiler -> Sakrij funkcije biblioteke, sakriva funkcije ugrađene u PHP od opšte analize. Kada su obje ove postavke omogućene, vidite manje podataka, što vam omogućava da se fokusirate na područja vašeg koda kojima je potrebna optimizacija.
Glavni prozor sadrži dvije kartice: Red po red i Sveukupno. Obje kartice prikazuju iste informacije, ali kartica Općenito objedinjuje informacije za bolju prezentaciju. Self time prikazuje vrijeme rada koda u trenutnom bloku, dok kumulativno vrijeme (Cum.) prikazuje ukupno vrijeme rada funkcija u datom bloku.

KCacheGrind: analiza dnevnika profilisanja u Unixu

Unix verzija KCachegrind-a pruža više funkcionalnosti od WinCachegrind-a. KCachegrind vizualizira podatke i gradi graf poziva.
Da biste ga počeli koristiti, morate instalirati KCachegrind. Trenutna verzija . Dostupna je novija verzija (0.10.1), ali je dio Valgrind paketa.
Ako je moguće, koristite menadžer paketa da instalirate KCachegrind paket. KCachegrind koristi GraphViz za crtanje grafova poziva, tako da morate instalirati i GraphViz paket ako vaš upravitelj paketa ne instalira automatski zavisne pakete.
Ako ne pronađete binarni paket KCachegrind, morat ćete sami kompajlirati KCachegrind. Nakon preuzimanja izvora, pokrenite

./configure --prefix=/opt/kde3
napraviti
napravi instalaciju

Kao što možete primijetiti, morate odrediti putanju do trenutne instalacije KDE biblioteke. Ako ne znate gdje se nalaze KDE biblioteke na vašem sistemu, koristite

za prikaz putanje do KDE biblioteka.
Jednom instaliran, možete pokrenuti KCacheGrind iz komandne linije

Tabelarni prikaz podataka u KCachegrind-u je vrlo sličan WinCachegrind-u. Također možete prelaziti između apsolutnih i procentualnih vrijednosti. Neke KCachegrind funkcije nisu dizajnirane za PHP. Slika ispod prikazuje graf poziva programa phpMyAdmin:


Kao što vidite, većina vremena pokretanja je provedena unutar common.inc.php. Sljedeći snimak ekrana prikazuje vizualizaciju poziva funkcija unutar common.inc.php:

Ovaj blok koda pokreće dva require_once, što je upola manje vremena potrebnog za pokretanje common.inc.php. Dvostruki klik na bilo koji pravougaonik će vas odvesti dublje u analizu podataka.

Optimizacija koda na osnovu podataka profilisanja

Uvijek profilirajte svoje aplikacije prije optimizacije. Optimizaciju možete započeti i sami, na mjestu gdje vam se čini da će ova optimizacija donijeti efekta, ali to nije uvijek tačno. Optimizacija uglavnom ima efekta samo u onim dijelovima koji oduzimaju najviše vremena u procesu izvršenja.
Ako pokrećete više kopija programa u isto vrijeme, možda ćete ipak morati optimizirati dio programa koji zauzima većinu vremena izvršavanja. U ovom slučaju, optimizacija neće učiniti posluživanje jednog pojedinačnog zahtjeva bržim, ali će omogućiti vašem serveru da se nosi sa velikim opterećenjem, dok će trošiti manje resursa za servisiranje tih zahtjeva.
Kada gledate trajanje pokretanja profilera, imajte na umu da su apsolutne vrijednosti manje važne od relativnih vrijednosti. Mjereno na različitim sistemima, apsolutne vrijednosti mogu varirati. Međutim, prije nego počnete optimizirati svoj kod, razmotrite sljedeće stvari.
Važno pravilo u optimizaciji je smanjenje broja I/O operacija. Neke I/O operacije oduzimaju mnogo vremena u poređenju sa proračunima. Smanjenje takvih operacija može biti veoma efikasan način da ubrzate svoj program. Uklanjanje jednog I/O poziva može pružiti efikasnije poboljšanje od trošenja puno sati na optimizaciju koda. Stoga bi se prvo trebali fokusirati na I/O operacije prije nego što počnete s kodiranjem.
Također možete povećati broj svojih servera prije optimizacije. Možete kupiti ogroman, što će vam dati malo povećanje produktivnosti. Vrijeme razvoja je skuplje od cijene novog servera. A ako povećate količinu hardvera, možete biti sigurni da ćete odmah dobiti povećanje bez ikakvog uticaja na PHP kod. Kada programer potroši jedan ili dva dana na optimizaciju koda, nikada ne možete reći koliko će se povećati produktivnost. I na kraju, više ne možete biti sigurni da optimizacija neće donijeti greške.
Pretvaranje nekih stranica u statičke jedan je od načina za postizanje boljih performansi. Recimo da postoji sajt sa velikim prometom, gde PHP skripta kreira prvu stranicu za svaki zahtev, birajući informacije iz baze podataka ili XML datoteke. Ako se podaci na stranici mijenjaju dovoljno često, možete ponovo kreirati njihovu statičnu kopiju. Ako konverzija u statički prikaz nije moguća za stranicu (neke lične informacije se prikazuju na stranici), neke blokove možete pretvoriti u statički prikaz.
Drugi nivo optimizacije ne zahteva promenu PHP koda. Kao što znamo, PHP je interpretirani jezik. To znači da se njegove naredbe prevode u vrijeme izvođenja u srednji kod. Emitovanje se ponavlja svaki put kada se skripta pokrene. Ovo čini PHP sporijim u poređenju sa jezicima kao što su C ili Java, koji ne zahtevaju raščlanjivanje koda svaki put kada ga pokrenete. Za PHP, možete koristiti keš srednjeg predstavljanja (pogledajte moj prevod....) da sačuvate i ponovo koristite srednji kod, ovo čini pokretanje i izvršenje bržim.
Sve ovo ne znači da ovo nije vrijeme ili mjesto za optimizaciju PHP koda. Neke optimizacije koda mogu značajno poboljšati performanse. Međutim, uvijek imajte na umu da promjena koda uvijek nosi rizik uvođenja dodatnih grešaka i sigurnosnih problema. Također zapamtite da optimizacija vašeg koda čini ga manje čitljivim.

Zaključak

Kreiranje i vizualizacija dnevnika profilisanja jedan je od važnih uslova za optimizaciju PHP koda. Morate znati koja mjesta u programu oduzimaju najviše vremena i tu treba da počnete s optimizacijom.
U sljedećem članku ćemo pogledati otklanjanje grešaka pomoću xdebug-a. xdebug vam može pružiti mogućnost udaljenog otklanjanja grešaka. Koristeći klijent koji ima ovu mogućnost, kao što je Eclipse PDT, možete otkloniti greške u svom kodu bez promjene, postaviti tačke prekida, skakati kroz dijelove koda i vidjeti kako i gdje varijable mijenjaju vrijednosti.

Posljednje ažurirano: 01.12.2019

Objava: 01.09.2016


Koristeći PhpStorm, možete analizirati performanse vašeg PHP koda profilišući ga. Profiliranje će vam omogućiti da prikupite statistiku izvršavanja programa: imena izvršenih funkcija, koliko puta je svaka funkcija izvršena, vrijeme izvršenja svake funkcije, koje su druge funkcije pozvane unutar svake funkcije, itd.

Ove informacije vam mogu dati savjete o tome gdje se vaš kod može poboljšati.

Hajde da vidimo kako to radi.

1. Preduvjeti

PhpStorm IDE može koristiti informacije o profiliranju prikupljene pomoću alata Xdebug. Ovo proširenje mora biti instalirano i konfigurirano na vašem sistemu. Za više informacija pogledajte Vodič za instalaciju Xdebug-a.

Ako ste korisnik prekrasne prijenosne serverske platforme i softverskog okruženja Open Server, onda ne morate ništa raditi - ekstenzija Xdebug je već instalirana i povezana.

Pažnja

Xdebug nije kompatibilan sa IonCube. IonCube je alat (uslužni programi) za zaštitu softvera napisanog u PHP programskom jeziku. Onemogućite IonCube ekstenziju u potpunosti ili dok koristite Xdebug. Drugi mogući problem mogao bi biti taj što je Xdebug konfiguriran po defaultu na portu 9000, koji je isti port koji koristi Open Server. Da biste riješili ovaj problem, u jednom od slučajeva trebate promijeniti broj porta.

Sve ovdje opisane radnje su reproducirane s ispravnim očekivanim rezultatima u sljedećem tehnološkom okruženju:

2. Omogućavanje Xdebug profilera

Profilisanje dodaje određene troškove pokretanju aplikacije i generiše ogromnu količinu informacija o disku. Stoga je najbolje omogućiti Xdebug profiler samo kada je to potrebno i onemogućiti ga u normalnim okolnostima.

Xdebug se konfiguriše putem direktiva u aktivnoj datoteci php.ini. Kad god omogućite profiler, morate konfigurirati sljedeću direktivu:

xdebug.profiler_output_dir = /path/to/store/snapshots

Vrijednost direktive mora specificirati putanju koja će se koristiti za spremanje datoteka za profiliranje.

2.1. Globalno

Da biste omogućili Xdebug profiler globalno, morate koristiti sljedeću direktivu:

xdebug.profiler_enable = 1

Na ovaj način, profiliranje će se izvoditi svaki put kada se pokrene bilo koja skripta. Ovu opciju je zgodno koristiti za omogućavanje profilatora samo u rijetkim slučajevima.

2.2. Korištenje dodatnih opcija tumača

Profiler možete omogućiti korištenjem dodatnih parametara tumača u prozoru Run/Debug Configurations. Da biste ga otvorili, koristite sljedeće stavke u glavnom meniju IDE:

Opcija (označena crvenim obrisom na slici iznad) Opcije tumača (opcije tumača) odjeljak Komandna linija (komandna linija) treba da sadrži sljedeći red:

D xdebug.profiler_enable = 1

Ova opcija će vam omogućiti da koristite profiler za određenu konfiguraciju, a ne na globalnoj razini.

2.3. Korištenje posebnih GET/POST parametara ili kolačića

Za više kontrolirano profiliranje treba koristiti sljedeću direktivu:

xdebug.profiler_enable_trigger = 1

Ako je vrijednost direktive postavljena na 1, tada će se prilikom izvršavanja skripte sa GET/POST parametrom ili kolačićem pod nazivom XDEBUG_PROFILE, profiliranje izvršiti bez obzira na postavku xdebug.profiler_enable.

Ova opcija za omogućavanje profilera je najpopularnija.

3. Zbirka dnevnika profiliranja

Da biste mogli analizirati dnevnike profiliranja, oni se prvo moraju prikupiti.

3.1. Zbirka dnevnika profiliranja za web aplikacije

Da biste profilirali web aplikacije, koristite Xdebug profiler globalno ili ga pokrenite i zaustavite na zahtjev. Nakon što uključite profilator, otvorite aplikaciju u pretraživaču da počnete prikupljati podatke - dnevnike profiliranja.

Kada analizirate probleme s performansama, korištenje bookmarkleta ili ekstenzija pretraživača za otklanjanje grešaka je vrlo dobar pristup jer vam omogućava da se krećete kroz aplikaciju i pokrenete profilator samo kada se otkrije problem s performansama. Ovo vam omogućava da prikupljate ciljane dnevnike profiliranja.

3.2. Zbirka dnevnika profiliranja za CLI aplikacije i jedinične testove

Za profiliranje CLI aplikacija i jediničnih testova, koristite Xdebug profiler globalno ili kreirajte zasebnu konfiguraciju pokretanja da biste omogućili profilator pomoću prozora Run/Debug Configurations. Zatim pokrenite CLI aplikaciju ili jedinične testove za prikupljanje podataka o profiliranju.

Kada analizirate probleme performansi u jediničnim testovima, dobar pristup je kreiranje zasebne konfiguracije za pokretanje samo onih jediničnih testova za koje se sumnja da imaju probleme s performansama. Ovo vam omogućava da prikupljate ciljane dnevnike profiliranja.

4. Analiza opisa dnevnika profiliranja

Pogledajmo pobliže dnevnik profiliranja.

4.1. Otvaranje dnevnika profiliranja

Da otvorite dnevnik profiliranja, koristite sljedeće stavke u glavnom meniju IDE: .

Ako ste korisnik divne portabl serverske platforme Open Server, onda možete koristiti i multi-platformski alat Webgrind za pregled dnevnika profiliranja. Može se pronaći preko sledećih stavki glavnog menija Open Server [Napredno → PHP profiler].

Dnevnici profilisanja se spremaju u fasciklu prema konfigurisanoj direktivi xdebug.profiler_output_dir. Generirano ime datoteke uvijek počinje sa cachegrind.out. i završava se ili s ID-om procesa PHP ili web servera ili crc32 hešom direktorija u kojem se nalazi profilirana skripta.


4.2. Tab. Statistika izvršenja

Na kartici Statistika izvršavanja možete ispitati zbirne informacije o metrikama izvršenja svake pozvane funkcije. Možete vidjeti sve datoteke, pozive funkcija, koliko puta su pozvani i vrijeme izvršenja (apsolutno i relativno) svake funkcije.

Gornja mreža prikazuje različite metrike:

  • Vlastito vrijeme - količina vremena koju funkcija provede izvršavajući svoj kod (bez uzimanja u obzir poziva drugih funkcija).

Donja mreža prikazuje dvije kartice: Callees - funkcije koje skripta poziva ovdje i Callers - odakle je skripta pozvana. Ovdje možete vidjeti različite metrike:

  • Vrijeme - ukupno vrijeme izvršenja.
  • Pozivi - broj poziva.

Funkcije s dugim vremenom izvršavanja ili velikim brojem poziva svakako zahtijevaju testiranje.

4.3. Kartica Stablo poziva

Kartica Stablo poziva prikazuje puteve izvršenja vašeg koda. Ovdje možete vidjeti detaljnije informacije o vremenu izvršavanja svake funkcije i tako dalje.

Gornja mreža prikazuje stabla poziva (koje se funkcije pozivaju u drugim funkcijama) i druge metrike:

  • Pozivna (pozvana datoteka) - datoteka koja je izvršena.
  • Vrijeme - ukupno vrijeme izvršenja.
  • Pozivi - broj poziva.

Donja mreža prikazuje dvije kartice: Callees - funkcije koje se ovdje pozivaju i Callers - odakle se poziva funkcija. Ovdje možete vidjeti različite metrike:

  • Pozivna (zvana funkcija) - funkcija koja je izvršena.
  • Vrijeme - ukupno vrijeme izvršenja.
  • Pozivi - broj poziva.

Kontrolna pitanja

  1. Zašto su PHP aplikacije profilisane?
  2. Koliko glavnih načina postoji da se omogući Xdebug profiler?
  3. Koji je najbolji način da nastavite sa profiliranjem CLI aplikacija i jediničnih testova?
  4. Koji alati se mogu koristiti za analizu dnevnika profiliranja?
  5. Kada analizirate dnevnik profiliranja, na koje metrike prvo treba obratiti pažnju?

Profiliranje aplikacije je prikupljanje podataka o brzini izvršavanja različitih programskih sekcija (fajlova i funkcija). Postoji mnogo PHP alata za profilisanje, ali nisu svi alati prikladni za izvođenje analize direktno u proizvodnji.

XHProf- mega jednostavan profiler koji prikuplja statistiku direktno dok aplikacija radi bez skoro nikakvih troškova.

Zašto profil?

Ako aplikacija počne sporo raditi, profiliranje vam može pomoći da otkrijete koji dio je spor. Rezultat profiliranja je obično lista izvršenih funkcija i vrijeme njihovog izvršavanja.

Profilisanje treba obaviti prije bilo kakve optimizacije aplikacije. U suprotnom ćete biti vođeni nagađanjem. Najvjerovatnije netačno.

Xdebug problem

Xdebug je moćno rješenje za PHP. Ali sama Xdebug platforma je toliko teška da je ne može se koristiti na stranicama uživo. XDebug stvara značajno opterećenje na serverskim resursima i usporava aplikaciju.

S druge strane, problemi na živoj stranici mogu biti potpuno drugačiji od onih u razvojnom okruženju. Profilisanje samo na računarima programera će pokazati samo dio problema.

Zbog toga je i razvijeno rješenje XHprof. Namijenjen je za korištenje u pokrenutim aplikacijama. Glavna ideja ovog profilatora je stvoriti minimalno opterećenje aplikacije uz prikupljanje svih potrebnih podataka o brzini rada. Rješenje su razvili momci iz Facebooka i podržano je novim verzijama PHP-a.

XHProf

Instalacija

Na Debianu XHprof je u sid paketima, tako da: apt-get install xhprof

Takođe možete sami napraviti XHprof.

Omogući profilisanje

Recimo da imamo skriptu sa sljedećim kodom:

izvršiti();

Izvršimo profiliranje pomoću XHprof. Za ovo na ovoj stranici potrebno vam je:

  1. Omogućite profiler na samom početku.
  2. Na samom kraju programa zaustavite profiler i sačuvajte primljene podatke.

To će izgledati ovako:

# Inicijalizirajte profilerxhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY); # Izvršite program nakon što uključite profiler izvršiti(); # Zaustavite profiler nakon izvršavanja programa$xhprof_data = xhprof_disable();

# Sačuvajte rezultat profilisanja u varijablu $xhprof_data

  • Funkcija xhprof_enable() uzima zastavice kao argumente. XHPROF_FLAGS_CPU za snimanje statistike procesora, XHPROF_FLAGS_MEMORY za memoriju, XHPROF_FLAGS_NO_BUILTINS za ignorisanje ugrađenih funkcija.
  • xhprof_disable()će isključiti profiler i vratiti prikupljenu statistiku.

Izvještaji

Generacija

Prikupljeni podaci se mogu analizirati u XHprof interfejsu za generisanje izveštaja. Da biste to učinili, morate preuzeti izvore XHprof-a: cd /var/www; wget http://pecl.php.net/get/xhprof-0.9.4.tgz gzip -d xhprof-0.9.4.tgz tar -xvf xhprof-0.9.4.tar

Nakon ovoga, potrebno je izvršiti promjene u skripti:

include_once "/var/www/xhprof-0.9.4/xhprof_lib/utils/xhprof_lib.php"; include_once "/var/www/xhprof-0.9.4/xhprof_lib/utils/xhprof_runs.php"; $xhprof_runs = novi XHProfRuns_Default(); $run_id = $xhprof_runs->save_run($xhprof_data, "test");

# Novi kod sprema izvještaj za korištenje u GUI

Interfejs za izvještaje

Da biste vidjeli izvještaj, potrebno je da konfigurišete virtuelni host u folderu /var/www/xhprof-0.9.4/xhprof_html. Na primjer, u Nginxu:

Server ( server_name xh..9.4/xhprof_html; index index.php; lokacija ~* \.(php)$ ( fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; uključi fastcgi_params; fastcgi_param SCRIPT_FILENAME$fastc_root)$document;xgi -s reload

Nakon ovoga, pojavit će se lista izvještaja:

Tabela sadrži popis funkcija koje su izvršene unutar jedne stranice s dodatnim informacijama:

  • Pozivi — broj i procenat poziva funkcija.
  • Incl. Wall Time — vrijeme izvršenja funkcije sa ugniježđenim funkcijama.
  • Excl. Vrijeme zida je vrijeme izvršenja funkcije bez ugniježđenih funkcija.
  • Incl. CPU - procesorsko vrijeme sa ugniježđenim funkcijama.
  • Excl. CPU - procesorsko vrijeme bez ugniježđenih funkcija.
  • Incl. MemUse - potrošnja memorije sa ugniježđenim funkcijama.
  • Excl. MemUse - potrošnja memorije bez ugniježđenih funkcija.
  • Incl. PeakMemUse - maksimalna potrošnja memorije sa ugniježđenim funkcijama.
  • Excl. PeakMemUse - maksimalna potrošnja memorije bez ugniježđenih funkcija.

Grafički izvještaji

Da biste napravili grafički izvještaj, uvjerite se da imate instaliran graphviz: apt-get install graphviz

Resursno intenzivni dijelovi koda su istaknuti žutom (srednje) i crvenom (najteže). To su oni dijelovi koda koji koriste mnogo resursa u odnosu na ostatak programa. Ovo može biti jedna spora funkcija ili više poziva brzoj funkciji. U našem primjeru, funkcija str_replace() označeno crvenom zbog 262 poziva.

Zbirni izvještaji

Interfejs XHprof vam takođe omogućava da vidite zbirne informacije iz nekoliko izveštaja odjednom. Da biste to učinili, run_id se prosljeđuje odvojeno zarezima: http://xh..php?run= 53a894f6d5d9b,53a894fcf126e&izvor=test

TL;DR

Koristite XHprof da profilišete PHP direktno u proizvodnji.

Instaliranje xhprof-a za php:

Sudo apt-get install php5-xhprof

Ponovo pokrenite Apache:

Sudo servis apache2 restart

Print phpinfo(); i provjeriti da li je modul spojen ili ne?

Provjeravamo /etc/php5/apache2/conf.d da vidimo da li se tamo pojavljuje veza do konfiguracije xhprof.ini.

Ako ne, onda sami kreirajte vezu i ponovo pokrenite Apache.

Sudo ln -s /etc/php5/mods-available/xhprof.ini /etc/php5/apache2/conf.d/20-xhprof.ini sudo servis apache2 restart

Provjeravamo xhprof vezu, provjerimo da li je 20-xhprof.ini povezan:

Snimak ekrana prikazuje verziju 0.9.2, iako je tokom instalacije bila prikazana verzija 0.9.4, ali nam to nije prepreka.

Sada možemo profilirati naš kod.

  1. Na početku stranice omogućite profilisanje pomoću xhprof_enable();
  2. Na kraju stranice isključite profilisanje pomoću xhprof_disable() i sačuvajte prikupljene podatke pomoću save_run();
  3. Zatim analiziramo.

Funkcija xhprof_enable() uzima zastavice kao argumente:

XHPROF_FLAGS_CPU za snimanje statistike procesora,

XHPROF_FLAGS_MEMORY - za memoriju,

XHPROF_FLAGS_NO_BUILTINS - da ignorišete ugrađene funkcije.

Da bismo sačuvali i dalje izvještavali, moramo instalirati alat za analizu profila.

Preuzmite arhivu sa alatom za analizu sa stranice xhprof:, uzmite verziju 0.9.4.

Na serveru ili lokalnom računaru kreirajte fasciklu kojoj možete pristupiti preko localhost-a ili zasebne domene u koju raspakujemo preuzetu arhivu:

Sada možemo sačuvati profil.

https://xn--d1acnqm.xn--j1amh/altadmin/posts/edit/188

Kôd za praćenje izgleda otprilike ovako:

// Inicijaliziraj profiler - računat ćemo i vrijeme procesora i potrošnju memorije xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
// Profilirani kod # Zaustavi profiler $xhprof_data = xhprof_disable(); # Sačuvajte izveštaj i generišite vezu za pregled include_once "/var/www/html/xhprof-0.9.4/xhprof_lib/utils/xhprof_lib.php"; include_once "/var/www/html/xhprof-0.9.4/xhprof_lib/utils/xhprof_runs.php"; $xhprof_runs = novi XHProfRuns_Default(); $run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_test"); echo "Izvještaj: http://localhost/xhprof-0.9.4/xhprof_html/index.php?run=$run_id&source=xhprof_test"; echo "\n";

/var/www/html/xhprof-0.9.4 - putanja do fascikle u koju smo raspakovali biblioteke koje su nam potrebne.

Izvještaj: http://localhost/xhprof-0.9.4/xhprof_html/index.php?run=57c32f3095d21&source=xhprof_test

Ovako izgleda analiza profila. Ova tablica prikazuje sve pozive funkcija koji su profilirani.

Funkcije možemo sortirati klikom na naslove tabele.

Kada vidimo da se neka funkcija izvršava mnogo puta ili jako dugo, možemo kliknuti na ovu funkciju i otvorit će se slična tablica ali sa internim pozivima unutar dotične funkcije i roditeljskog okruženja u kojem je funkcija pozvana.

Indikatori:
Total Inc. Wall Time (vrijeme utrošeno na izvršavanje funkcija, uzimajući u obzir čekanje odgovora od utičnica, sistema datoteka i drugih resursa)
Total Inc. CPU (vrijeme provedeno u izvršavanju funkcija)
Total Inc. MemUse (potrošnja memorije)
Total Inc. PeakMemUse (vršna upotreba memorije)
Broj poziva funkcija

Postoji i mogućnost grafičkog prikaza izvještaja. Ali da biste to učinili, morate biti sigurni da imate instaliranu biblioteku graphviz:

Apt-get install graphviz

Zatim u svom profilu trebate kliknuti za prikaz i voila:

Sada možete analizirati i poboljšati kod.

Profilisanje PHP koda

Prije ili kasnije, svako od nas se suoči sa naslijeđenim kodom i njegovom optimizacijom. U takvoj situaciji, debuger i profiler su najbolji asistenti programera. Za one koji rade sa PHP-om, zahvaljujući Dericku Rethansu, postoji dobar alat - xDebug. Čak iu RuNetu postoji puno informacija o xDebug-u, tako da ovaj članak neće biti o tome.

Kada sam naišao na pominjanje profilera za PHP, odmah sam pomislio na xDebug (odavno sam zaboravio na vlasničke alate iz Zenda), ali ovaj put sam pogrešio - pričaćemo o XHProf.
XHProf

Ovaj profiler je razvijen posebno za Facebook, a njegov izvorni kod je otvoren u martu 2009.

Instalacija je protekla prilično brzo i glatko.
wget pecl.php.net/get/xhprof-0.9.2.tgz
tar xvf xhprof-0.9.2.tgz
cd xhprof-0.9.2/extension/
phpize
./configure && napravi && napravi instalaciju
cd /usr/local/etc/php.d/
vim xhprof.ini
cd /usr/local/
vim header.php
vimfooter.php
vim etc/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

Hajde da analiziramo pomenute konfiguracije

Xhprof.ini
extension=/usr/local/lib/php/extensions/no-debug-non-zts-20090626/xhprof.so
xhprof.output_dir="/home/max/www/profile/"

Prof.my.conf - Nginx konfiguracija - najstandardnija.

Server (
slušaj 80;
server_name prof.my;
charset utf8;

Root /usr/local/src/xhprof-0.9.2/xhprof_html ;
lokacija/(
index index.php;
}

Lokacija ~ \.php$ (
fastcgi_pass 127.0.0.1:12000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/src/xhprof-0.9.2/xhprof_html/$fastcgi_script_name;
uključiti fastcgi_params;

U /usr/local/src/xhprof-0.9.2/xhprof_html postoje PHP izvori koji kreiraju dobar WEBGUI za profiler.

Dakle, o dva glavna fajla:

Header.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 = "moja aplikacija"; // imenski prostor za vašu aplikaciju
$xhprof_data = xhprof_disable();
$xhprof_runs = novi XHProfRuns_Default();
$run_id = $xhprof_runs->save_run($xhprof_data, $profiler_namespace);

// url za XHProf UI biblioteke (promijenite ime i putanju hosta)
$profiler_url = sprintf("http://prof.my/index.php?run=%s&source=%s", $run_id, $profiler_namespace);
echo<<Izlaz profilera
OUT;
}
}

Sada pokrećemo bilo koju PHP skriptu preko weba i vidimo u gornjem lijevom uglu link do izlaza profilera - upravo za to je kreiran host prof.my

Imajte na umu - koristim provjeru COOKIE! Uz takvu provjeru, možete sigurno koristiti profiler na proizvodnom serveru - na stvarnim podacima i stvarnom opterećenju.

Web sučelje profilatora prikazuje znakove s informacijama o svakoj funkciji i javlja sljedeće informacije:

  • Broj poziva za svaku funkciju
  • Zidno vrijeme, vrijeme provedeno u izvršavanju funkcija (uključujući čekanje odgovora od utičnica, sistema datoteka, itd.).
  • CPU-vrijeme, vrijeme provedeno u izvršavanju funkcija (isključujući čekanje odgovora od utičnica, sistema datoteka, itd.).
  • Upotreba memorije
  • Vrhunska upotreba memorije

Tabelu je moguće sortirati po bilo kom od parametara

Informacije o svakoj funkciji podijeljene su u još dvije vrste: Inkluzivno i Isključivo. Uključuje uključuje cifre koje koriste dječji pozivi, dok ih Ekskluzivno ne uključuje. Također je moguće kliknuti na naziv funkcije da biste vidjeli informacije samo o njoj i funkcijama iz kojih je pozvana i koje je ona pozvala.

Ako je GraphViz instaliran na sistemu, profiler će nacrtati graf poziva za vas.

P.S. Bez kršenja tradicije: ovo je moj prvi post na Habréu.

UPD: ponovo objavljeno u PHP-u.

mob_info