Kako podesiti pametne telefone i računare. Informativni portal
  • Dom
  • Windows 10
  • PHP profilisanje sa XHProf - profesionalnim alatom za programere web aplikacija. Profilisanje i otklanjanje grešaka u PHP aplikacijama sa xhprof & FirePHP Omogućavanje Xdebug Profilera

PHP profilisanje sa XHProf - profesionalnim alatom za programere web aplikacija. Profilisanje i otklanjanje grešaka u PHP aplikacijama sa xhprof & FirePHP Omogućavanje Xdebug Profilera

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.

Ekstenzija za PHP pod nazivom Xdebug je dostupna za pomoć u profiliranju PHP aplikacija, kao i za otklanjanje grešaka u toku izvršavanja. Prilikom pokretanja profilatora, izlaz se upisuje u datoteku u binarnom formatu pod nazivom "cachegrind". Na svakoj platformi su dostupne aplikacije za analizu ovih datoteka. Za izvođenje ovog profiliranja nisu potrebne promjene koda aplikacije.

Da biste omogućili profilisanje, instalirajte ekstenziju i prilagodite postavke php.ini. Neke Linux distribucije dolaze sa standardnim paketima (npr. Ubuntuov php-xdebug paket). U našem primjeru ćemo pokrenuti profil opciono na osnovu parametra zahtjeva. Ovo nam omogućava da postavke zadržimo statičke i uključimo profiler samo prema potrebi.

# php.ini postavke # Postavite na 1 da biste ga uključili za svaki zahtjev xdebug.profiler_enable = 0 # Koristimo GET/POST parametar da uključimo profiler xdebug.profiler_enable_trigger = 1 # GET/POST vrijednost koju ćemo proslijediti ; prazno ; za bilo koju vrijednost xdebug.profiler_enable_trigger_value = "" # Izlaz cachegrind fajlova u /tmp tako da ih naš sistem kasnije očisti xdebug.profiler_output_dir = "/tmp" xdebug.profiler_output_name = "cachegrind.out.%p"

Zatim koristite web klijent da napravite zahtjev za URL vaše aplikacije koji želite profilirati, npr.

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

Kako se stranica obrađuje, ona će pisati u datoteku s imenom sličnim

/tmp/cachegrind.out.12345

Po defaultu, broj u imenu datoteke je ID procesa koji ga je napisao. Ovo se može konfigurirati pomoću postavke xdebug.profiler_output_name.

Imajte na umu da će napisati jednu datoteku za svaki PHP zahtjev/proces koji se izvršava. Tako, na primjer, ako želite analizirati objavu obrasca, jedan profil će biti napisan za GET zahtjev za prikaz HTML obrasca. Parametar XDEBUG_PROFILE će se morati proslijediti u sljedeći POST zahtjev za analizu drugog zahtjeva koji obrađuje obrazac. Stoga je prilikom profiliranja ponekad lakše pokrenuti curl za POST obrazac direktno.

Analiza izlaza

Jednom napisana predmemorija profila može biti pročitana od strane aplikacije kao što je ili Webgrind. PHPStorm, popularni PHP IDE, takođe može prikazati ove podatke profilisanja.

KCachegrind će, na primjer, prikazati informacije uključujući:

  • Izvršene funkcije
  • Vrijeme poziva, i samo po sebi i uključujući naknadne pozive funkcija
  • Broj poziva svake funkcije
  • Grafovi poziva
  • Linkovi na izvorni kod

Šta tražiti

Očigledno je podešavanje performansi vrlo specifično za slučaj upotrebe svake aplikacije. Općenito je dobro tražiti:

  • Ponovljeni pozivi istoj funkciji koje ne biste očekivali da vidite. Za funkcije koje obrađuju i traže podatke to bi mogle biti prve mogućnosti za keširanje vaše aplikacije.
  • Funkcije sporog rada. Gdje aplikacija provodi većinu svog vremena? najbolja isplata u podešavanju performansi je fokusiranje na one dijelove aplikacije koji troše najviše vremena.

Bilješka: Xdebug, a posebno njegove karakteristike profilisanja, su veoma intenzivni i usporavaju izvršavanje PHP-a. Preporučljivo je da ih ne izvodite u okruženju proizvodnog servera.

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.

Vremenom se svaki PHP programer suočava sa problemom loše performanse svoje aplikacije. Moguće je da se određena stranica sporo učitava ili da odgovor API-ja traje predugo. I ponekad je prilično teško razumjeti koji je razlog za kočnice? Ponekad se dešavaju složenije situacije: na produkcijskom serveru API je veoma spor, ali na klupi gde se odvija razvoj sve je u redu. I idi shvati šta nije u redu. Otklanjanje grešaka na proizvodnom serveru je ekstremni stepen beznađa, do kojeg je, naravno, bolje ne dovesti.

Za takve situacije su izmišljeni specijalni alati koji se nazivaju profilatori aplikacija. U svijetu PHP-a ovu ulogu igra xDebug, kao i xhprof. xhprof je lakši, jednostavniji i fleksibilniji alat, pa je njegova upotreba poželjnija. Zanimljivo je da je xhprof razvio facebook još 2009. godine, ali još uvijek nema službene podrške za php7 od njih i neće je više postojati otkako je facebook prešao na HHVM. Međutim, zahvaljujući širokoj zajednici PHP programera, pojavio se fork koji podržava PHP7, čija instalacija ne izaziva nikakve poteškoće.

Instalacija

Prvo trebate instalirati xhprof:

Git klon 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

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

/var/tmp/xhprof folder mora imati pristup za pisanje, jer rezultati profiliranja će biti sačuvani tamo.

Možete ponovo učitati PHP-FPM i provjeriti da li je proširenje instalirano. To je banalno, ovo se može učiniti korištenjem izlaza funkcije phpinfo();

xhprof je instaliran, možete ga koristiti. xhprof paket uključuje vrlo jednostavan interfejs za analizu izveštaja o profilisanju. xhprof vam omogućava da pravite izveštaje, kako u tekstualnom tako iu grafičkom obliku. Instalacijski folder xhprof sadrži xhprof_html i xhprof_lib, koji će nam trebati. Folder xhprof_html - omogućava pristup GUI. xhprof_lib - biblioteka za prikaz i analizu koda. Preporučljivo je premjestiti cijeli xhprof folder u /var/www/xhprof i konfigurirati virtuelni host za njega, na primjer xhprof.loc. Primjer za nginx:

Server ( slušaj 80; server_name xhprof.loc; charset utf-8; root /var/www/xhprof/xhprof_html; indeks index.php; lokacija / ( try_files $uri $uri/ /index.php?q=$uri&$args ; ) lokacija ~ \.php ( fastcgi_pass 127.0.0.1:9000; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; uključi fastcgi)_params

Također morate zapamtiti da ažurirate hosts fajl. Sada, kada unesemo URL xhprof.loc u pretraživač, bićemo odvedeni na web interfejs profilera, gde će fajlovi koje generiše biti dostupni.

Sada možete nastaviti direktno sa profiliranjem koda.

Da biste omogućili profiler, koristite funkciju xhprof_enable() koja prihvata sljedeće zastavice kao ulaz:

  • XHPROF_FLAGS_CPU - za snimanje statistike procesora;
  • XHPROF_FLAGS_MEMORY - za memoriju;
  • XHPROF_FLAGS_NO_BUILTINS - da ignorišete ugrađene funkcije.

Da biste onemogućili profilator, koristite funkciju xhprof_disable(). Radi praktičnosti, napisaćemo dvije skripte header.php i footer.php koje obavljaju ove funkcije. header.php je uključen na početku profilisane skripte, a footer.php - na kraju. footer.php je također odgovoran za pohranjivanje podataka profiliranja.

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/xhprof_runs.php" xhprof_enable(XHPROF_FLAGS_CPU); ) footer.php: if (extension_loaded("xhprof")) ( $profilerNamespace = "NAZIV PROFILED_SCRIPT OVDJE"; $xhprofData = xhprof_disable(); $xhprofRuns = new XHProfRuns = new XHProf_Default); fRuns->save_run ($xhprofData, $profilerNamespace); )
Upotreba

Nakon što povežete header.php i footer.php na profiliranu skriptu, možete početi: prilikom izvršavanja profilirane skripte, generirat će se datoteka koja će biti sačuvana u direktoriju /var/tmp/xhprof, sa informacijama o radu skripte. script. Kada otvorite web sučelje xhprof.loc, ova generirana datoteka će biti dostupna:


Kada otvorite datoteku za profiliranje, pojavljuju se detaljne informacije o radu aplikacije, cijeli niz poziva:


Šta znače kolone:

  • Pozivi- broj i procenat poziva funkcije;
  • Incl. Wall Time- vrijeme izvršenja funkcije sa ugniježđenim funkcijama;
  • Excl. Wall Time- vrijeme izvršenja funkcije bez ugniježđenih funkcija;
  • Incl. CPU- CPU vrijeme sa ugniježđenim funkcijama;
  • Excl. CPU- CPU 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.

Ako pratite vezu, prikazat će se prekrasno stablo poziva s vizualnom indikacijom najsporijeg koda. Ako se to ne dogodi, najvjerovatnije ćete morati instalirati biblioteku graphviz:

Apt-get install graphviz

Primjer konstruiranog grafa:

U mom slučaju, usko grlo je interakcija sa bazom podataka.


Korištenje xhprof-a na proizvodnom serveru

U početku, xhprof je razvijen posebno za potrebe profiliranja koda u borbi, na proizvodnim serverima. Jednostavno ne postoji drugi besplatni i efikasan alat za profilisanje PHP7 koda u borbi, tako da xhprof nema konkurenciju. Konkretno, imam iskustvo korištenja xhprof-a na proizvodnom serveru koji obrađuje milion zahtjeva dnevno. Koristi php7 i do sada nisu pronađeni nikakvi problemi. Međutim, xhprof se ne pokreće za svaki zahtjev - generirao bi previše datoteka za profiliranje. Za mene, profiler se pokreće samo ako zahtjev ima zaglavlje “XHPROF_ENABLE” i postavljeno je na true. Možete koristiti i drugu strategiju, na primjer, nasumično pokrenuti profiler s vjerovatnoćom od, recimo, 1/1000. Tada će takođe biti prilično jasna slika.


Zaključak

Iako xhprof nije zvanično podržan za php7, on je i dalje nezamjenjiv alat za php programere.

Pokazao je kako instalirati i konfigurirati xdebug i pokrio neke osnovne karakteristike, kao što je poboljšanje izlaza funkcije var_dump() ili ispis 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 to 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 vizualizaciji 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 je potrebno opisati prolazak svake linije. Stoga, baš kao iu slučaju praćenja, nemojte pokretati profilisanje na produkcijskim serverima... Međutim, postoje slučajevi kada je profiliranje 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 prevodioca, 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.

Najbolji članci na ovu temu