Profilizimi i php. Profilizimi dhe korrigjimi i aplikacioneve PHP me xhprof & FirePHP

Ai tregoi se si të instaloni dhe konfiguroni xdebug dhe mbulonte disa veçori themelore, të tilla si përmirësimi i daljes së funksionit var_dump() ose printimi i një gjurmimi të pirgut të thirrjeve kur merrni një mesazh gabimi. Në pjesën e dytë ne e shikuam këtë veçori xdebug si gjurmim. Gjurma përmban të gjitha thirrjet për funksionet dhe metodat në program, kohën e fillimit, madhësinë e memories opsionale, parametrat e kaluar dhe të kthyer. Një regjistër gjurmësh mund t'ju ndihmojë të kuptoni rrugën e ekzekutimit të një programi kompleks. Në vend që të futni kodin e korrigjimit brenda programit, aktivizoni ose çaktivizoni gjurmimin aty ku është e nevojshme dhe më pas përdorni shërbime si grep ose aplikacionet tuaja PHP për të analizuar skedarin e regjistrit.

Në këtë artikull do të shikojmë profilizimin. Në pamje të parë, profilizimi është i ngjashëm me gjurmimin. Regjistri i profilizimit nuk është i destinuar për njerëzit, nuk ka për qëllim të vizualizojë rrjedhën e një programi, por na ofron të dhëna për analizën statistikore të një programi që funksionon.

Krijimi i një regjistri të profilizimit

Më poshtë është një fragment i shkurtër nga regjistri i profilizimit i krijuar nga xdebug:

fl=php:internal
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
thirrje = 1 0 0
13 6
cfn=php:: define
thirrje = 1 0 0
18 4
cfn=php:: define
thirrje = 1 0 0
23 2


Siç mund ta shihni, regjistri i profilizimit nuk mund të lexohet drejtpërdrejt. Ne do të përdorim mjete shtesë për të vizualizuar dhe analizuar të dhënat e marra. Pra, profilizimi tregon se sa herë është nisur një linjë e caktuar dhe sa kohë ka marrë nisja.
Krijimi i një regjistri të profilizimit degradon shumë performancën, ngjashëm me krijimin e një regjistri gjurmësh, sepse ju duhet të përshkruani kalimin e çdo rreshti. Prandaj, ashtu si në rastin e gjurmimit, mos ekzekutoni profilizimin në serverët e prodhimit... Megjithatë, ka raste kur profilizimi duhet të ekzekutohet në një sistem të drejtpërdrejtë. Në këtë rast, jini të kujdesshëm për ekzekutimin e xdebug në të njëjtën kohë me shtesa të tjera Zend, të tilla si ngarkues, optimizues ose memorie të fshehtë.
Në mënyrë që xdebug të fillojë regjistrimin e regjistrave të profilizimit, shtoni

Ju lutemi vini re se nuk mund të ekzekutoni profilizimin gjatë nisjes duke ekzekutuar një komandë.
Meqenëse regjistri i profilizimit synohet të lexohet nga programet e analizuesit, nuk ka cilësime shtesë që ju lejojnë të shfaqni informacion shtesë, siç është rasti me regjistrin e gjurmëve. Megjithatë, ka disa cilësime që ju lejojnë të konfiguroni profilizimin, të ngjashëm me ato që kemi përdorur gjatë konfigurimit të gjurmimit.
Së pari, xdebug shkruan regjistrin e profilizimit në drejtorinë /tmp si parazgjedhje. Nëse jeni duke përdorur Windows, duhet të rregulloni php.ini, si kjo:
xdebug.profiler_output_dir="c:\traces"

Si parazgjedhje, xdebug rishkruan regjistrin ekzistues të profilizimit. Mund ta konfiguroni që të plotësojë ekzistuesin duke shtuar komandën e mëposhtme

në php.ini. Ka raste kur nuk dëshironi të krijoni një regjistër të profilizimit për të gjithë skedarët, por në të njëjtën kohë aktivizimi i profilizimit në kohën e ekzekutimit është problematik. Në vend që të aktivizoni dhe çaktivizoni periodikisht profilizimin, shtoni komandën
xdebug.profiler_enable_trigger=Aktiv

në php.ini. Tani mund ta aktivizoni dhe çaktivizoni profilizimin duke i kaluar një parametër të veçantë GET ose POST XDEBUG_PROFILE në një skript PHP. Kjo do të mundësojë profilizimin vetëm për këtë skript PHP. Nuk është e nevojshme të vendosni vlerën e këtij parametri, thjesht mos harroni të shtoni këtë parametër në adresën test.php?XDEBUG_PROFILE.

Emri i regjistrit të profilizimit

Emri që xdebug i cakton regjistrit të profilizimit si parazgjedhje është "cachegrind.out". plus identifikuesin e procesit. Ashtu si në rastin e regjistrit të gjurmëve, mund të ndryshoni emrat e regjistrit duke shtuar cilësimet e duhura në php.ini. Emri i parametrit xdebug.profiler_output_name. Argumenti është një varg. të cilat mund të përmbajnë modifikues të ndryshëm. Më të rëndësishmet janë më poshtë:

  • %p – identifikuesi i procesit
  • %r – numër i rastësishëm
  • %u - kohë
  • %H – vlera e _SERVER $["HTTP_HOST"]
  • %R – vlera prej $_SERVER["REQUEST_URI"]
  • %s – emri duke përfshirë shtegun e plotë, të pjerrët konvertohen në nënvizime
Ju lutemi vini re se modifikuesi %s përdoret vetëm për xdebug.profiler_output_name. Nëse dëshironi të dini emrin e regjistrit të profilizimit, mund të telefononi funksionin xdebug_get_profiler_filename().

Analiza e regjistrit të profilizimit
Siç u përmend më lart, për të analizuar regjistrin e profilizimit, nevojiten programe shtesë për vizualizimin e të dhënave. Të gjithë regjistrat e profilizimit që krijon xdebug janë në një format të ngjashëm me formatin Cachegrind. Cachegrind është një profilues që është pjesë e një programi më të fuqishëm të quajtur Valgrind, një program për korrigjimin dhe profilizimin e softuerit për Linux. Cachegrind u krijua për të analizuar statistikat e cache-ve, përdorimin e memories dhe komandat e programit. Një tjetër mjet Valgrind, Callgrind, vizaton grafikët e thirrjeve. Në lidhje me PHP-në, ne mund ta përdorim këtë aplikacion për të vizualizuar dhe analizuar regjistrin e profilizimit.
Mjeti që përdoret zakonisht për të analizuar regjistrin e profilizimit të krijuar nga xdebug quhet . KCachegrind është softuer i lirë i licencuar sipas GPL (funksionon vetëm në sistemet Unix). Megjithatë, ekziston një program i thjeshtë për Windows, i cili gjithashtu është falas. Le të shohim fillimisht versionin e Windows.

WinCacheGrind: analiza e regjistrave të profilizimit në Windows

Versioni aktual (në kohën e shkrimit nga autori i këtij artikulli) i WinCachegrind është 1.0.0.12. Ky version daton në 2005, që do të thotë se WinCachegrind nuk është zhvilluar për një kohë të gjatë. Nëse shikoni shënimet e lëshimit, autorët shkruajnë se programi ka gabime që ndonjëherë e bëjnë atë të sillet çuditërisht.
Prandaj, unë rekomandoj përdorimin e KCachegrind, të lançuar në bazë të një makinerie virtuale në shpërndarjen më të fundit Linux, për shembull Ubuntu (shënimi i përkthyesit, në përgjithësi, një rekomandim i çuditshëm; në këtë rast, unë do të rekomandoja vetëm instalimin e Linux-it dhe jo gardhin në kopshti i makinave virtuale). Ekziston një numër i madh i makinave virtuale të disponueshme nën Windows. Nëse nuk është e mundur të përdorni Unix ose një makinë virtuale për ndonjë arsye, mund të vazhdoni të përdorni WinCachegrind për analizë të thjeshtë të regjistrit të profilizimit. WinCachegrind nuk vizaton grafikë thirrjesh, ndryshe nga KCachegrind.
Instalimi i Wincachegrind është jashtëzakonisht i lehtë. Drejtoni instaluesin, klikoni në butonin për të pranuar licencën dhe instalimi përfundon. Tani mund të ekzekutoni programin dhe të hapni një nga regjistrat e profilizimit të cachegrind të krijuar nga xdebug.

Duke klikuar në orën ose në ikonën sigma, mund të kaloni midis shfaqjes së informacionit në vlera absolute dhe përqindje. Shfaqja e përqindjes tregon se sa kohë, si përqindje e kohës totale, duhet për të thirrur një funksion në një bllok të caktuar.
Dy cilësime të dobishme janë Profiler -> Fshih funksionet e shpejta dhe Profiler -> Fshih funksionet e bibliotekës. Ndërprerësi i parë fsheh funksione, kontributi kohor i të cilëve në kohën e përgjithshme të ekzekutimit të programit është i parëndësishëm.
Cilësimi i dytë, Profiler -> Fshih funksionet e bibliotekës, fsheh funksionet e integruara në PHP nga analiza e përgjithshme. Kur të dyja këto cilësime janë të aktivizuara, ju shihni më pak të dhëna, duke ju lejuar të përqendroheni në zonat e kodit tuaj që kanë nevojë për optimizim.
Dritarja kryesore përmban dy skeda: rresht pas rreshti dhe "Përgjithshme". Të dy skedat tregojnë të njëjtin informacion, por skeda "Përgjithshme" grumbullon informacionin për një prezantim më të mirë. Self time tregon kohën e ekzekutimit të kodit në bllokun aktual, ndërsa koha kumulative (Cum.) tregon kohën totale të ekzekutimit të funksioneve në bllokun e dhënë.

KCacheGrind: analiza e regjistrave të profilizimit në Unix

Versioni Unix i KCachegrind ofron më shumë funksionalitet sesa WinCachegrind. KCachegrind vizualizon të dhënat dhe ndërton një grafik thirrjesh.
Për të filluar përdorimin e tij, duhet të instaloni KCachegrind. Versioni aktual. Një version më i ri (0.10.1) është i disponueshëm, por është pjesë e paketës Valgrind.
Nëse është e mundur, përdorni një menaxher paketash për të instaluar paketën KCachegrind. KCachegrind përdor GraphViz për të vizatuar grafikët e thirrjeve, kështu që duhet të instaloni gjithashtu paketën GraphViz nëse menaxheri juaj i paketave nuk instalon automatikisht paketa të varura.
Nëse nuk e gjeni paketën binare KCachegrind, do t'ju duhet ta përpiloni vetë KCachegrind. Pasi të keni shkarkuar burimet, ekzekutoni

./configure --prefix=/opt/kde3
bëjnë
bëj instalimin

Siç mund ta vini re, duhet të specifikoni shtegun për instalimin aktual të bibliotekës KDE. Nëse nuk e dini se ku ndodhen bibliotekat e KDE në sistemin tuaj, përdorni

për të shfaqur shtegun për në bibliotekat e KDE.
Pasi të instalohet, mund të ekzekutoni KCacheGrind nga linja e komandës

Shfaqja tabelare e të dhënave në KCachegrind është shumë e ngjashme me WinCachegrind. Ju gjithashtu mund të kaloni midis vlerave absolute dhe përqindjes. Disa veçori të KCachegrind nuk janë të dizajnuara për PHP. Fotografia më poshtë tregon grafikun e thirrjes së programit phpMyAdmin:


Siç mund ta shihni, pjesa më e madhe e kohës së fillimit u shpenzua brenda common.inc.php. Pamja e mëposhtme e ekranit tregon një vizualizim të thirrjeve të funksioneve brenda common.inc.php:

Ky bllok kodi ekzekuton dy request_onces, që është gjysma e kohës që duhet për të ekzekutuar common.inc.php. Klikimi i dyfishtë në çdo drejtkëndësh do t'ju çojë më thellë në analizën e të dhënave.

Optimizimi i kodit bazuar në të dhënat e profilizimit

Profilizoni gjithmonë aplikacionet tuaja përpara se të optimizoni. Mund ta filloni vetë optimizimin, në vendin ku ju duket se ky optimizim do të sjellë një efekt, por kjo nuk është gjithmonë e vërtetë. Optimizimi kryesisht ka efekt vetëm në ato pjesë që marrin më shumë kohë në procesin e ekzekutimit.
Nëse jeni duke ekzekutuar shumë kopje të një programi në të njëjtën kohë, mund t'ju duhet ende të optimizoni pjesën e programit tuaj që merr pjesën më të madhe të kohës së ekzekutimit. Në këtë rast, optimizimi nuk do ta bëjë më të shpejtë shërbimin e një kërkese individuale, por do të lejojë serverin tuaj të trajtojë ngarkesa të larta duke konsumuar më pak burime për t'i shërbyer atyre kërkesave.
Kur shikoni kohëzgjatjet e ekzekutimit të profilit, mbani në mend se vlerat absolute janë më pak të rëndësishme se vlerat relative. Matur në sisteme të ndryshme, vlerat absolute mund të ndryshojnë. Megjithatë, përpara se të filloni të optimizoni kodin tuaj, merrni parasysh gjërat e mëposhtme.
Një rregull i rëndësishëm në optimizim është zvogëlimi i numrit të operacioneve I/O. Disa operacione I/O kërkojnë shumë kohë në krahasim me llogaritjet. Reduktimi i operacioneve të tilla mund të jetë një mënyrë shumë efektive për të shpejtuar programin tuaj. Heqja e një telefonate hyrëse/dalëse mund të sigurojë një përmirësim më efektiv sesa të shpenzoni shumë orë duke optimizuar kodin. Prandaj, duhet të përqendroheni në operacionet I/O së pari përpara se të filloni kodimin.
Ju gjithashtu mund të rrisni numrin e serverëve tuaj përpara se të optimizoni. Mund të blini një të madhe, e cila do t'ju japë një rritje të vogël të produktivitetit. Koha e zhvillimit është më e shtrenjtë se çmimi i një serveri të ri. Dhe nëse rritni sasinë e harduerit, mund të jeni të sigurt se do ta merrni menjëherë rritjen pa asnjë ndikim në kodin PHP. Kur një zhvillues shpenzon një ose dy ditë duke optimizuar kodin, nuk mund të thuash kurrë se sa do të rritet produktiviteti. Dhe në fund, nuk mund të jeni më i sigurt se optimizimi nuk do të sjellë ndonjë gabim.
Konvertimi i disa faqeve në faqe statike është një mënyrë për të arritur performancë më të mirë. Le të themi se ekziston një sajt me shumë trafik, ku një script PHP krijon faqen e parë për çdo kërkesë, duke zgjedhur informacionin nga një bazë të dhënash ose skedar XML. Nëse të dhënat në një faqe ndryshojnë mjaft shpesh, mund të rikrijoni një kopje statike të saj. Nëse konvertimi në një pamje statike nuk është i mundur për një faqe (disa informacione personale shfaqen në faqe), mund të konvertoni disa blloqe në pamje statike.
Një nivel tjetër optimizimi nuk kërkon ndryshimin e kodit PHP. Siç e dimë PHP është një gjuhë e interpretuar. Kjo do të thotë që komandat e tij përkthehen në kohën e ekzekutimit në kod të ndërmjetëm. Transmetimi përsëritet sa herë që ekzekutohet skenari. Kjo e bën PHP më të ngadaltë në krahasim me gjuhët si C ose Java, të cilat nuk kërkojnë analizimin e kodit sa herë që e ekzekutoni. Për PHP, ju mund të përdorni memoriet e brendshme të përfaqësimit (shih përkthimin tim...) për të ruajtur dhe ripërdorur kodin e ndërmjetëm, kjo e bën fillimin dhe ekzekutimin më të shpejtë.
E gjithë kjo nuk do të thotë se ky nuk është koha apo vendi për të optimizuar kodin PHP. Disa optimizime të kodit mund të përmirësojnë shumë performancën. Sidoqoftë, mbani mend gjithmonë se ndryshimi i kodit mbart gjithmonë rrezikun e futjes së gabimeve shtesë dhe çështjeve të sigurisë. Mos harroni gjithashtu se optimizimi i kodit tuaj e bën atë më pak të lexueshëm.

konkluzioni

Krijimi dhe vizualizimi i një regjistri të profilizimit është një nga kushtet e rëndësishme për optimizimin e kodit PHP. Ju duhet të dini se cilat vende në program marrin më shumë kohë, dhe këtu duhet të filloni të optimizoni.
Në artikullin vijues do të shikojmë korrigjimin duke përdorur xdebug. xdebug mund t'ju ofrojë mundësinë për të kryer korrigjimin në distancë. Duke përdorur një klient që e ka këtë aftësi, siç është Eclipse PDT, mund të korrigjoni kodin tuaj pa e ndryshuar atë, të vendosni pika ndërprerjeje, të kaloni nëpër seksione të kodit dhe të shihni se si dhe ku ndryshojnë vlerat variablat.


Ndonjëherë ViewProfile.swf dhe gabime të tjera të sistemit SWF mund të lidhen me probleme në regjistrin e Windows. Disa programe mund të përdorin skedarin ViewProfile.swf, por kur ato programe çinstalohen ose modifikohen, ndonjëherë regjistrimet "jetime" (të pasakta) të regjistrit SWF lihen pas.

Në thelb, kjo do të thotë që ndërsa shtegu aktual i skedarit mund të ketë ndryshuar, vendndodhja e tij e mëparshme e gabuar është ende e regjistruar në Regjistrin e Windows. Kur Windows përpiqet të kërkojë këto referenca të pasakta të skedarëve (vendndodhjet e skedarëve në kompjuterin tuaj), mund të ndodhin gabime ViewProfile.swf. Për më tepër, një infeksion malware mund të ketë dëmtuar shënimet e regjistrit të lidhura me Bioshock 2. Prandaj, këto regjistrime të korruptuara të regjistrit SWF duhet të rregullohen për të rregulluar problemin në rrënjë.

Redaktimi manual i regjistrit të Windows për të hequr çelësat e pavlefshëm ViewProfile.swf nuk rekomandohet nëse nuk jeni profesionist i shërbimit të kompjuterit. Gabimet e bëra gjatë redaktimit të regjistrit mund ta bëjnë kompjuterin tuaj të pafuqishëm dhe të shkaktojnë dëme të pariparueshme në sistemin tuaj operativ. Në fakt, edhe një presje e vendosur në vendin e gabuar mund të parandalojë nisjen e kompjuterit tuaj!

Për shkak të këtij rreziku, ne rekomandojmë shumë përdorimin e një pastrues të besuar të regjistrit, si p.sh. WinThruster (zhvilluar nga partneri i certifikuar i Microsoft Gold) për të skanuar dhe riparuar çdo problem regjistri të lidhur me ViewProfile.swf. Duke përdorur një pastrues regjistri, mund të automatizoni procesin e gjetjes së shënimeve të dëmtuara të regjistrit, referencave të skedarëve që mungojnë (si ai që shkakton gabimin ViewProfile.swf) dhe lidhjeve të prishura brenda regjistrit. Përpara çdo skanimi, krijohet automatikisht një kopje rezervë, e cila ju lejon të zhbëni çdo ndryshim me një klikim dhe duke ju mbrojtur nga dëmtimet e mundshme të kompjuterit tuaj. Pjesa më e mirë është se eliminimi i gabimeve të regjistrit mund të përmirësojë në mënyrë dramatike shpejtësinë dhe performancën e sistemit.


Paralajmërim: Nëse nuk jeni përdorues i kompjuterit me përvojë, ne NUK ju rekomandojmë modifikimin manual të Regjistrit të Windows. Përdorimi i gabuar i redaktorit të regjistrit mund të shkaktojë probleme serioze që mund t'ju kërkojnë të riinstaloni Windows. Ne nuk garantojmë që problemet që rezultojnë nga përdorimi i gabuar i Redaktuesit të Regjistrit mund të korrigjohen. Ju përdorni redaktorin e regjistrit në rrezikun tuaj.

Përpara se të riparoni manualisht regjistrin e Windows, duhet të krijoni një kopje rezervë duke eksportuar një pjesë të regjistrit të lidhur me ViewProfile.swf (p.sh. Bioshock 2):

  1. Klikoni në butonin Filloni.
  2. fut " komandë"V shiriti i kërkimit... MOS KLIKO ENDE HYN!
  3. Ndërsa mbani të shtypur çelësat CTRL-Shift në tastierën tuaj, shtypni HYN.
  4. Do të shfaqet një kuti dialogu për qasje.
  5. Klikoni po.
  6. Kutia e zezë hapet me një kursor që pulson.
  7. fut " regedit" dhe shtypni HYN.
  8. Në Redaktorin e Regjistrit, zgjidhni çelësin e lidhur me ViewProfile.swf (p.sh. Bioshock 2) që dëshironi të kopjoni.
  9. Në meny Skedari zgjidhni Eksporto.
  10. Në listë Ruaje në Zgjidhni dosjen ku dëshironi të ruani çelësin rezervë të Bioshock 2.
  11. Në fushë Emri i skedarit Futni një emër për skedarin rezervë, për shembull "Bioshock 2 rezervë".
  12. Sigurohuni në fushë Gama e eksportit vlera e zgjedhur Dega e zgjedhur.
  13. Klikoni Ruaj.
  14. Skedari do të ruhet me shtrirje .reg.
  15. Tani keni një kopje rezervë të hyrjes tuaj të regjistrit të lidhur me ViewProfile.swf.

Hapat e mëposhtëm për modifikimin manual të regjistrit nuk do të përshkruhen në këtë artikull, pasi ato mund të dëmtojnë sistemin tuaj. Nëse dëshironi më shumë informacion rreth redaktimit manual të regjistrit, ju lutemi shikoni lidhjet më poshtë.

FirePHP është një shtesë për firebug, e cila, në lidhje me klasën e saj të vogël php, ju lejon të transmetoni të dhëna nga php, për shembull, të gjitha llojet e var_dump dhe informacione të tjera korrigjuese, në konsolën e zjarrit. Avantazhi kryesor i kësaj shtese është se i gjithë informacioni i korrigjimit transmetohet përmes titujve dhe nuk i ndot faqet dhe nuk e thyen në asnjë mënyrë logjikën e aplikacionit Uebfaqja zyrtare: http://firephp.org/.

Ideja kryesore.

Algoritmi i përgjithshëm i profilizimit është si më poshtë:
  1. Në fillim të faqes ne mundësojmë profilizimin duke përdorur xhprof_enable()
  2. Në fund të faqes, çaktivizoni profilizimin duke përdorur xhprof_disable() dhe ruani të dhënat e mbledhura duke përdorur save_run()
  3. Më pas, duke përdorur klasën php firephp, ne kalojmë një lidhje me të dhënat e profilizimit në pjesën e klientit
  4. Në konsolën e firebug ne hapim informacionin që na nevojitet
  5. Ne gëzohemi :)
Do të doja të them gjithashtu se, sigurisht, shtimi manual i këtyre funksioneve në skriptet tuaja PHP është i shkëlqyeshëm. Por unë dua që ky informacion të jetë gjithmonë pranë gjatë zhvillimit dhe të mos përfundojë në serverët e prodhimit. Ne e zgjidhim këtë problem si më poshtë:

Në projektet tona, pothuajse në të gjitha skriptet, në fillim lidhet një skedar pune me një ngarkues të klasës, funksione lidhëse dhe gjëra të tjera të nevojshme. Prandaj, ne përfshijmë përfshirjen e profilizimit në këtë dosje. Dhe në mënyrë që të jemi në gjendje të aktivizojmë/fikim modalitetin e korrigjimit sipas dëshirës, ​​ne shtuam një kontroll për konstantën e konfigurimit, plus këto kontrolle i mbështjellëm në disa meta-etiketa që hiqen automatikisht kur projekti ndërtohet. E njëjta gjë vlen edhe për çaktivizimin e profilizimit dhe shkrimit të informacionit në titujt duke përdorur firephp - këto detyra zgjidhen nga një funksion, i cili thirret në fund të çdo skripti PHP dhe gjithashtu është i mbështjellë me meta etiketa. Duket diçka si kjo:

// Konstantet e mëposhtme shkruhen në skedarin e konfigurimit të aplikacionit

/** Mënyra e funksionimit të mjedisit * */
define("APPLICATION_ENV" , "dev" ); // dev - korrigjimi | pro - prodhimit
/** Rruga drejt profiluesit */
define("XHPROF_ROOT" , __DIR__. "/ExtProcs/debug/xhprof-0.9.2");

/***************************************************************************************
* Më pas, në skedarin që ngarkohet në fillim të çdo skripti, ne nisim profilizimin
* DEV_START dhe DEV_END janë etiketat tona meta, çdo gjë ndërmjet tyre pritet gjatë montimit
***************************************************************************************/

//-- DEV_START
//-- në modalitetin e korrigjimit ne lidhim bibliotekat e korrigjimit

// Ngarko firephp
kërkon_një herë (__DIR__ . "/includes/ExtProcs/debug/firephp/FirePHP.class.php");
//-- ngarkoni profilin
"/xhprof_lib/utils/xhprof_lib.php");
kërkon_një herë (XHPROF_ROOT. "/xhprof_lib/utils/xhprof_runs.php");
// Inicializoni profilizimin me flamujt e nevojshëm. Përshkrimi i detajuar i flamujve
// mund të gjendet në php.net/manual/ru/xhprof.constants.php
xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
}
//-- DEV_END

// Epo, ky funksion thirret në fund të çdo skenari
// Thirrja e saj është gjithashtu e mbështjellë në DEV_START dhe DEV_END

/**
* Krijoni një lidhje me rezultatin e profilizimit dhe shfaqeni atë në tastierë
*/
funksioni dev_boot_Down() (
nëse (APPLICATION_ENV === "dev") (
// Inicializoni instancën firephp
$firephp = FirePHP::getInstance(true);
// Çaktivizo profilizimin dhe ruaj të dhënat
$xhprof_data = xhprof_disable();
$xhprof_runs = i ri XHProfRuns_Default();
$run_id = $xhprof_runs->ruaj_run($xhprof_data, "xhprof_testimi" );
// Krijo një lidhje me të dhënat e profilizimit dhe shkruaje në tastierë
$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, "profiling data" );
}
}


* Ky kod burim u theksua me theksuesin e kodit burimor.

Nuk do të hyj në detaje rreth instalimit të këtyre shtesave, sepse gjithçka është e thjeshtë këtu. Unë do të them vetëm për disa aspekte të konfigurimit. xhproof ka vetëm një ndryshore konfigurimi - xhprof.output_dir, e cila tregon dosjen ku do të ruhen të dhënat e profilizimit. Prandaj, sigurohuni që përdoruesi nën të cilin ekzekutohen skriptet PHP të ketë të drejta shkrimi në drejtorinë e specifikuar. Pra, shkruani diçka të tillë në php.ini tuaj:


extension=xhprof.kështu
xhprof.output_dir="/var/tmp/xhprof"

Është gjithashtu një ide e mirë të instaloni diçka si pika ose Graphviz për të vizatuar grafikët e thirrjeve. Unë kam Graphviz në MacOS X.

Pas përfundimit të procedurave të përshkruara më sipër, ne ishim në gjendje të hapnim dhe shikonim profilizimin e ndonjë prej skripteve tona direkt në shfletues në çdo kohë.

Një shtesë në PHP e quajtur Xdebug është e disponueshme për të ndihmuar në profilizimin e aplikacioneve PHP, si dhe korrigjimin e kohës së ekzekutimit. Gjatë ekzekutimit të profilit, dalja shkruhet në një skedar në një format binar të quajtur "cachegrind". Aplikacionet janë të disponueshme në çdo platformë për të analizuar këto skedarë. Nuk nevojiten ndryshime të kodit të aplikacionit për të kryer këtë profilim.

Për të aktivizuar profilizimin, instaloni shtesën dhe rregulloni cilësimet e php.ini. Disa shpërndarje Linux vijnë me paketa standarde (p.sh. paketa php-xdebug e Ubuntu-së, në shembullin tonë, ne do të ekzekutojmë profilin sipas një parametri kërkese. Kjo na lejon të mbajmë cilësimet statike dhe të aktivizojmë profilin vetëm sipas nevojës.

# php.ini settings # Vendoseni në 1 për ta ndezur atë për çdo kërkesë xdebug.profiler_enable = 0 # Le të përdorim një parametër GET/POST për të aktivizuar profilin xdebug.profiler_enable_trigger = 1 # Vlera GET/POST që do të kalojmë ; për çdo vlerë xdebug.profiler_enable_trigger_value = "" # Nxjerrë skedarët cachegrind në /tmp kështu që sistemi ynë i pastron ato më vonë xdebug.profiler_output_dir = "/tmp" xdebug.profiler_output_name = "cachegrind.out.%p"

Më pas përdorni një klient web për të bërë një kërkesë në URL-në e aplikacionit tuaj që dëshironi të profilizoni, p.sh.

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

Ndërsa faqja përpunon, ajo do të shkruajë në një skedar me një emër të ngjashëm me

/tmp/cachegrind.out.12345

Si parazgjedhje, numri në emrin e skedarit është id i procesit që e ka shkruar atë. Kjo mund të konfigurohet me cilësimin xdebug.profiler_output_name.

Vini re se do të shkruajë një skedar për çdo kërkesë/proces PHP që ekzekutohet. Kështu, për shembull, nëse dëshironi të analizoni një postim formulari, do të shkruhet një profil për kërkesën GET për të shfaqur formularin HTML. Parametri XDEBUG_PROFILE do të duhet të kalojë në kërkesën pasuese POST për të analizuar kërkesën e dytë që përpunon formularin. Prandaj gjatë profilizimit ndonjëherë është më e lehtë të ekzekutosh curl në POST drejtpërsëdrejti një formular.

Duke analizuar Produktin

Pasi të shkruhet, cache e profilit mund të lexohet nga një aplikacion si ose Webgrind. PHPStorm, një IDE popullore PHP, gjithashtu mund të shfaqë këto të dhëna profilizimi.

KCachegrind, për shembull, do të shfaqë informacione duke përfshirë:

  • Funksionet e ekzekutuara
  • Koha e thirrjes, si në vetvete ashtu edhe duke përfshirë thirrjet pasuese të funksionit
  • Sa herë thirret secili funksion
  • Grafikët e thirrjeve
  • Lidhje me kodin burimor

Çfarë duhet të kërkoni

Natyrisht, akordimi i performancës është shumë specifik për rastet e përdorimit të çdo aplikacioni. Në përgjithësi, është mirë të kërkoni:

  • Thirrjet e përsëritura për të njëjtin funksion që nuk do të prisnit të shihnit.
  • Funksionet e ngadalta. Ku e kalon aplikacioni pjesën më të madhe të kohës? fitimi më i mirë në akordimin e performancës është fokusimi në ato pjesë të aplikacionit që konsumojnë më shumë kohë.

shënim: Xdebug, dhe në veçanti veçoritë e tij të profilizimit, kërkojnë shumë burime dhe ngadalësojnë ekzekutimin e PHP. Rekomandohet që këto të mos ekzekutohen në një mjedis serveri prodhimi.

Duke përdorur sistemet e profilizimit, mund të grumbulloni informacione se cilat funksione në kodin PHP konsumojnë më shumë kohë CPU dhe RAM, domethënë të identifikoni vendet më të ngadalta dhe më të kërkuara për memorie në një program PHP.

xhprof

XHProf - profilizues PHP i zhvilluar nga Facebook.

Instalimi:

Aptitude install php-dardhë pecl install 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 rinisni apachectl

Skedarët e nevojshëm për punë janë të vendosura në drejtori /usr/share/php. Sidoqoftë, jo gjithçka, por vetëm me kodin PHP. Për shfaqje normale të raporteve, kërkohen jquery dhe css. Ato mund të merren nga depoja e github:

Klonimi i Git https://github.com/facebook/xhprof.git

Pas kësaj, shtoni rreshtin në kodin e skriptit PHP në vendin ku duhet të fillojë mbledhja e të dhënave:

Xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);

Parametrat për mbledhjen e të dhënave tregohen në kllapa. Në këtë rast, të dhënat do të mblidhen për ngarkesën e procesorit dhe përdorimin e RAM-it. Një opsion tjetër është i mundur XHPROF_FLAGS_NO_BUILTINS kur përdoret, të dhënat për funksionet e integruara nuk mblidhen.

$xhprof_data = xhprof_disable(); include_once "xhprof_lib/utils/xhprof_lib.php"; include_once "xhprof_lib/utils/xhprof_runs.php"; $xhprof_runs = i ri XHProfRuns_Default(); $run_id = $xhprof_runs->ruaj_run($xhprof_data, "xhprof_test"); echo "Raporti: http://domain.tld/xhprof_html/index.php?run=$run_id&source=xhprof_test"; jehonë "\n";

Ne rresht $run_id Thonjëzat tregojnë emrin e profilit, i cili mund të vendoset në mënyrë arbitrare.

Rezultati i përpunuar duket si ky:

Nëse specifikoni parametrin XHPROF_FLAGS_NO_BUILTINS, mund të shihet se numri i thirrjeve të funksionit është zvogëluar ndjeshëm:

Tabela jep informacionin e mëposhtëm:

Thirrjet- numri i thirrjeve të funksionit,
Koha e Murit- koha totale e funksionimit të funksionit, duke përfshirë kohën e kaluar në pritje të një përgjigjeje nga burimet e jashtme,
CPU- sa kohë është shpenzuar për përpunimin e funksioneve,
MemUse- sa RAM është përdorur,
PeakMemUse- konsumi maksimal i memories.

Modifikuesit janë:

Përfshirë- përfshirëse - duke marrë parasysh thirrjet për funksione të tjera nga ky funksion,
përjashtuar.- ekskluzive - duke përjashtuar thirrjet e funksioneve.

Përveç kësaj, sipër tabelës ka informacione për kohën totale të përpunimit, kujtesën e përdorur dhe numrin e thirrjeve të funksionit.

Gjithashtu XHProf ju lejon të krijoni raporte dallimesh midis dy ekzekutimeve, të cilat tregohen me ngjyra të kuqe dhe jeshile. Me këto raporte, ju mund të merrni një pamje të qartë të përmirësimeve pas çdo ndryshimi të kodit.

Për të marrë një raport të tillë, duhet të përdorni një lidhje si kjo:

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

Ku run_id1 Dhe run_id2- identifikuesit e nisjes.

Nëse instaloni Graphviz:

Aptitude install graphviz

Ekzistojnë gjithashtu ndërfaqe në internet të palëve të treta për profilin e php xhprof që përdorin bazat e të dhënave:

xDebug

xDebug- Korrigjuesi i kodit PHP me aftësi profilizimi, i shkruar nga Derick Rethans.

Instalimi:

Jum instaloni php5-xdebug

Pastaj ne modifikojmë konfigurimin:

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

duke shtuar rreshtat në të:

Xdebug.profiler_enable = 1 xdebug.profiler_aggregate = Në xdebug.profiler_output_dir = /tmp

Këtu aktivizojmë profiluesin PHP dhe specifikojmë drejtorinë në të cilën do të ruhen profilet. Profilet krijohen me emra si cachegrind.out.*

Ekziston një klient webgrind: https://github.com/jokkedk/webgrind. Nuk funksionon shumë shpejt, por ju lejon të shikoni shpejt profile të vogla. Në fakt, ky është kodi PHP që duhet të klonohet nga github:

Klonimi i Git https://github.com/jokkedk/webgrind.git

do të krijohet një direktori uebgrind, të cilin ju duhet ta kopjoni në drejtorinë e çdo faqeje dhe ta përdorni atë nga shfletuesi. Tjetra, për të bërë vizatimin në skedarin e konfigurimit të funksionojë në Debian config.php ju duhet të korrigjoni rrugën drejt skedarit të ekzekutueshëm grafviz. Duhet të duket kështu:

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

Përveç kësaj, ju mund të rregulloni zonën kohore:

Static $defaultTimezone = "Evropë/Moskë";

Në kokë, mund të zgjidhni një profil dhe të kontrolloni kutinë për të marrë parasysh funksionet e integruara. Tabela në vetvete tregon funksionet, numrin e thirrjeve, kohën e funksionimit të vetë funksionit dhe kohën duke përfshirë pritjen. Për të hyrë më thellë në funksionet, thjesht klikoni në shigjetën trekëndore. Në rastin tim, me profile mjaft të mëdha (nga disa megabajt), pritja për rezultatin ishte e panevojshme e lartë. Ndoshta është më mirë të përdorni programe lokale të shikimit për profile mjaft të mëdha.

Grafiku mund të duket si ky:

vini re se uebgrind nuk duhet të përdoret në serverët e prodhimit, pasi nuk ofrohet autorizim, por ka qasje në kodin e skedarit php. Nëse është e nevojshme, përdorni të paktën autorizimin bazë Apache.

Ekzistojnë gjithashtu programe për analizimin e profileve për Linux:

Rreth profilizimit

Të dhënat e profilit mund t'ju ndihmojnë të përmirësoni aplikacionin tuaj, domethënë të arrini qëllime të caktuara, për shembull, të zvogëloni konsumin e kujtesës, të zvogëloni kohën e krijimit të faqeve, etj.

Informacioni në profil është pika fillestare për optimizimin: ai tregon se sa kohë duhet për të gjeneruar rezultatin, sa memorie është përdorur dhe sa thirrje funksionesh janë bërë. Me të dhëna më të detajuara, mund t'i përmirësoni këto metrika.

Për shembull, nëse jeni duke përdorur një kornizë, atëherë përdorimi i disa prej funksioneve të kornizës mund të çojë në thirrje për disa funksione thelbësore. Nëse po lexoni disa të dhëna disa herë, mund të jetë me vlerë të ruani rezultatin në një variabël.

Profilizuesi gjithashtu mund t'ju ndihmojë të kuptoni se ku të përdorni ruajtjen e kodit PHP, për shembull, duke përdorur APCu ose memcached.

Para së gjithash, ia vlen të optimizoni funksionet që kërkojnë kohën më të madhe të ekzekutimit. Pasi gjithçka është optimizuar dhe duket se nuk ka asgjë për të përmirësuar, ia vlen të renditni funksionet sipas numrit të thirrjeve dhe të punoni për ta zvogëluar atë. Edhe nëse PHP është i shpejtë, ia vlen të merret parasysh nëse funksionet duhet të thirren kaq shpesh?

Nëse hasni situatat e mëposhtme, duhet të merrni parasysh ruajtjen e memories:

  • Funksionet e pandryshueshme thirren brenda një cikli,
  • Disa përmbajtje gjenerohen dy herë,
  • Përmbajtja që nuk ndryshon gjenerohet çdo herë,
  • Përmbajtja gjenerohet edhe nëse nuk përdoret.

Nuk duhet të ruani çdo gjë, pasi kujtesa është gjithashtu një burim i vlefshëm. Memorizojini të dhënat që ju aksesoni vazhdimisht. Gjithashtu, cachimi ka pak kuptim nëse memoria harxhon më shumë burime sesa kursen.

Përveç ruajtjes së kodit, mos harroni për ruajtjen e memories duke përdorur serverin në internet (), si dhe në anën e klientit. Nëse përdorni titujt e duhur, shumë kërkesa mund të zgjidhen para se të arrijnë te serveri.