Cum se configurează smartphone-uri și PC-uri. Portal informativ
  • Acasă
  • Windows 10
  • Profilare PHP cu XHProf - un instrument profesional pentru dezvoltatorii de aplicații web. Profilarea și depanarea aplicațiilor PHP cu xhprof și FirePHP Activarea Xdebug Profiler

Profilare PHP cu XHProf - un instrument profesional pentru dezvoltatorii de aplicații web. Profilarea și depanarea aplicațiilor PHP cu xhprof și FirePHP Activarea Xdebug Profiler

Cod PHP de profilare

Mai devreme sau mai târziu, fiecare dintre noi se confruntă cu un cod moștenit și cu optimizarea acestuia. Într-o astfel de situație, un depanator și un profiler sunt cei mai buni asistenți ai programatorului. Pentru cei care lucrează cu PHP, datorită lui Derick Rethans, există un instrument bun - xDebug. Există o mulțime de informații despre xDebug chiar și în RuNet, așa că acest articol nu va fi despre asta.

Când am dat peste o mențiune despre un profiler pentru PHP, m-am gândit imediat la xDebug (uitasem de mult de instrumentele proprietare de la Zend), dar de data aceasta m-am înșelat - vom vorbi despre XHProf.
XHProf

Acest profiler a fost dezvoltat special pentru Facebook, iar codul său sursă a fost deschis în martie 2009.

Instalarea a decurs destul de repede și fără probleme.
wget pecl.php.net/get/xhprof-0.9.2.tgz
tar xvf xhprof-0.9.2.tgz
cd xhprof-0.9.2/extensie/
phpize
./configure && make && make install
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 reporniți
cp vhost.conf.template prof.my.conf
sed -i s/site/prof/ prof.my.conf
vim prof.my.conf
/etc/init.d/nginx reporniți

Să analizăm configurațiile menționate

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

Prof.my.conf - Nginx config - cea mai standard.

Server (
asculta 80;
nume_server prof.meu;
set de caractere utf8;

Root /usr/local/src/xhprof-0.9.2/xhprof_html;
Locație/(
index index.php;
}

Locație ~ \.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;
include fastcgi_params;

În /usr/local/src/xhprof-0.9.2/xhprof_html există surse PHP care creează un WEBGUI bun pentru profiler.

Deci despre cele două fișiere principale:

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);
}
}

Subsol.php
if(isset($_COOKIE["xhprof"]))(
if (extension_loaded("xhprof")) (
$profiler_namespace = "myapp"; // spațiu de nume pentru aplicația dvs
$xhprof_data = xhprof_disable();
$xhprof_runs = nou XHProfRuns_Default();
$run_id = $xhprof_runs->save_run($xhprof_data, $profiler_namespace);

// url către bibliotecile XHProf UI (schimbați numele gazdei și calea)
$profiler_url = sprintf("http://prof.my/index.php?run=%s&source=%s", $run_id, $profiler_namespace);
ecou<<Ieșire Profiler
OUT;
}
}

Acum rulăm orice script PHP prin web și vedem în colțul din stânga sus un link către rezultatul profilerului - exact pentru asta a fost creat gazda prof.my

Vă rugăm să rețineți - folosesc verificarea COOKIE! Cu o astfel de verificare, puteți utiliza în siguranță profilerul pe un server de producție - pe date reale și încărcare reală.

Interfața web a profilerului afișează semne cu informații despre fiecare funcție și raportează următoarele informații:

  • Numărul de apeluri către fiecare funcție
  • Timp de perete, timp petrecut executând funcții (inclusiv așteptarea răspunsurilor de la socketuri, sistemul de fișiere etc.).
  • Timp CPU, timpul petrecut executând funcții (excluzând așteptarea răspunsurilor de la socketuri, sistemul de fișiere etc.).
  • Folosirea memoriei
  • Utilizare maximă a memoriei

Este posibil să sortați tabelul după oricare dintre parametri

Informațiile despre fiecare funcție sunt împărțite în alte două tipuri: Incluzive și Exclusive. Inclusive include cifrele folosite de apelurile copiilor, în timp ce Exclusive nu le include. De asemenea, este posibil să faceți clic pe numele unei funcții pentru a vedea informații doar despre aceasta și funcțiile din care a fost apelată și care au fost apelate de aceasta.

Dacă GraphViz este instalat pe sistem, profiler-ul va desena un grafic al apelurilor pentru dvs.

P.S. Fără a încălca tradițiile: aceasta este prima mea postare pe Habré.

UPD: repostat în PHP.

O extensie pentru PHP numită Xdebug este disponibilă pentru a ajuta la profilarea aplicațiilor PHP, precum și la depanarea în timp de execuție. La rularea profilelor, rezultatul este scris într-un fișier într-un format binar numit „cachegrind”. Pe fiecare platformă sunt disponibile aplicații pentru a analiza aceste fișiere. Nu sunt necesare modificări ale codului aplicației pentru a efectua această profilare.

Pentru a activa profilarea, instalați extensia și ajustați setările php.ini. Unele distribuții Linux vin cu pachete standard (de exemplu, pachetul php-xdebug al Ubuntu, în exemplul nostru, vom rula profilul opțional pe baza unui parametru de solicitare).

# php.ini settings # Setați la 1 pentru a-l activa pentru fiecare cerere xdebug.profiler_enable = 0 # Să folosim un parametru GET/POST pentru a porni profiler-ul xdebug.profiler_enable_trigger = 1 # Valoarea GET/POST pe care o vom transmite ; pentru orice valoare xdebug.profiler_enable_trigger_value = "" # Ieșiți fișierele cachegrind în /tmp, astfel încât sistemul nostru să le curețe mai târziu xdebug.profiler_output_dir = "/tmp" xdebug.profiler_output_name = "cachegrind.out.%p"

Apoi utilizați un client web pentru a face o solicitare către adresa URL a aplicației dvs. pe care doriți să o profilați, de ex.

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

Pe măsură ce pagina se procesează, va scrie într-un fișier cu un nume similar cu

/tmp/cachegrind.out.12345

În mod implicit, numărul din numele fișierului este id-ul procesului care l-a scris. Acesta este configurabil cu setarea xdebug.profiler_output_name.

Rețineți că va scrie un fișier pentru fiecare cerere / proces PHP care este executat. Deci, de exemplu, dacă doriți să analizați o postare de formular, va fi scris un profil pentru solicitarea GET pentru a afișa formularul HTML. Parametrul XDEBUG_PROFILE va trebui să fie trecut în cererea POST ulterioară pentru a analiza a doua cerere care procesează formularul. Prin urmare, la profilare, uneori este mai ușor să rulați curl pentru a POST direct un formular.

Analizând ieșirea

Odată scris, memoria cache a profilului poate fi citită de o aplicație precum sau Webgrind. PHPStorm, un IDE PHP popular, poate afișa și aceste date de profilare .

KCachegrind, de exemplu, va afișa informații, inclusiv:

  • Funcții executate
  • Timpul apelului, atât propriu-zis, cât și inclusiv apelurile de funcții ulterioare
  • De câte ori este apelată fiecare funcție
  • Apelați grafice
  • Legături către codul sursă

Ce anume sa cauti

În mod evident, reglarea performanței este foarte specifică cazurilor de utilizare ale fiecărei aplicații. În general, este bine să căutați:

  • Apelurile repetate la aceeași funcție pe care nu v-ați aștepta să le vedeți Pentru funcțiile care procesează și interogează datele, acestea ar putea fi oportunități principale pentru ca aplicația dvs.
  • Funcții cu funcționare lentă. Unde își petrece aplicația cea mai mare parte a timpului? cel mai bun profit în reglarea performanței este concentrarea asupra acelor părți ale aplicației care consumă cel mai mult timp.

Notă: Xdebug, și în special caracteristicile sale de profilare, consumă foarte mult resurse și încetinesc execuția PHP. Este recomandat să nu rulați acestea într-un mediu de server de producție.

Profilarea aplicației este colectarea de date privind viteza de execuție a diferitelor secțiuni de program (fișiere și funcții). Există multe instrumente de profilare PHP disponibile, dar nu toate instrumentele sunt potrivite pentru a efectua analize direct în producție.

XHProf- un mega-profiler simplu care colectează statistici direct în timp ce aplicația rulează aproape fără costuri generale.

De ce profil?

Dacă o aplicație începe să ruleze lent, profilarea vă poate ajuta să aflați care parte este lentă. Rezultatul profilării este de obicei o listă de funcții executate și timpul de execuție a acestora.

Profilarea trebuie făcută înainte de orice optimizare a aplicației. În caz contrar, vei fi ghidat de presupuneri. Cel mai probabil incorect.

Problema Xdebug

Xdebug este o soluție puternică pentru PHP. Dar platforma Xdebug în sine este atât de grea încât nu poate fi folosit pe site-uri live. XDebug creează o încărcare semnificativă a resurselor serverului și încetinește aplicația.

Pe de altă parte, problemele de pe un site live pot fi complet diferite de cele dintr-un mediu de dezvoltare. Profilarea numai pe computerele dezvoltator va afișa doar o parte a problemelor.

De aceea a fost dezvoltată soluția XHprof. Este destinat utilizării în aplicații care rulează. Ideea principală a acestui profiler este de a crea o încărcare minimă a aplicației în timp ce colectați toate datele necesare privind viteza de funcționare. Soluția a fost dezvoltată de băieții de la Facebook și este susținută de noi versiuni de PHP.

XHProf

Instalare

Pe Debian, XHprof este în pachete sid, deci: apt-get install xhprof

Puteți construi și dvs. XHprof.

Activați profilarea

Să presupunem că avem un script cu următorul cod:

a executa();

Să realizăm profilarea folosind XHprof. Pentru a face acest lucru pe această pagină aveți nevoie de:

  1. Activați profilerul chiar de la început.
  2. La sfârșitul programului, opriți profilerul și salvați datele primite.

Va arăta astfel:

# Inițializați profilerulxhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY); # Executați programul după pornirea profilelor a executa(); # Opriți profilerul după executarea programului$xhprof_data = xhprof_disable();

# Salvați rezultatul profilării în variabila $xhprof_data

  • Funcţie xhprof_enable() ia steaguri drept argumente. XHPROF_FLAGS_CPU pentru înregistrarea statisticilor procesorului, XHPROF_FLAGS_MEMORY pentru memorie, XHPROF_FLAGS_NO_BUILTINS pentru ignorarea funcțiilor încorporate.
  • xhprof_disable() va dezactiva profilerul și va returna statisticile colectate.

Rapoarte

Generaţie

Datele colectate pot fi analizate în interfața XHprof pentru a genera rapoarte. Pentru a face acest lucru, trebuie să descărcați sursele XHprof: 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

După aceasta, trebuie să faceți modificări la script:

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 = nou XHProfRuns_Default(); $run_id = $xhprof_runs->save_run($xhprof_data, "test");

# Codul nou salvează raportul pentru utilizare în GUI

Interfață pentru rapoarte

Pentru a vedea raportul, trebuie să configurați gazda virtuală în folderul /var/www/xhprof-0.9.4/xhprof_html. De exemplu, în Nginx:

Server (nume_server xh..9.4/xhprof_html; index index.php; locație ~* \.(php)$ ( fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root)_ginxcgi_script) -s reîncărca

După aceasta, va apărea o listă de rapoarte:

Tabelul conține o listă de funcții care au fost efectuate într-o singură pagină cu informații suplimentare:

  • Apeluri — numărul și procentul apelurilor de funcții.
  • Incl. Wall Time — timpul de execuție al unei funcții cu funcții imbricate.
  • Excl. Timpul de perete este timpul de execuție al unei funcții fără funcții imbricate.
  • Incl. CPU - timp procesor cu funcții imbricate.
  • Excl. CPU - timp procesor fără funcții imbricate.
  • Incl. MemUse - consum de memorie cu funcții imbricate.
  • Excl. MemUse - consum de memorie fără funcții imbricate.
  • Incl. PeakMemUse - consum maxim de memorie cu funcții imbricate.
  • Excl. PeakMemUse - consum maxim de memorie fără funcții imbricate.

Rapoarte grafice

Pentru a crea un raport grafic, asigurați-vă că aveți instalat graphviz: apt-get install graphviz

Secțiunile codului care necesită mult resurse sunt evidențiate cu galben (medie) și roșu (cel mai greu). Acestea sunt acele secțiuni de cod care folosesc o mulțime de resurse în raport cu restul programului. Aceasta poate fi o funcție lentă sau mai multe apeluri către o funcție rapidă. În exemplul nostru, funcția str_replace() marcat cu roșu din cauza a 262 de apeluri.

Rapoarte agregate

De asemenea, interfața XHprof vă permite să vizualizați informații agregate din mai multe rapoarte simultan. Pentru a face acest lucru, run_id este transmis separat prin virgule: http://xh..php?run= 53a894f6d5d9b,53a894fcf126e&source=test

TL;DR

Utilizați XHprof pentru a profila PHP direct în producție.

De-a lungul timpului, orice programator PHP se confruntă cu problema performanței slabe a aplicației sale. Este posibil ca o anumită pagină să se încarce lent sau că răspunsul de la API durează prea mult. Și uneori este destul de greu de înțeles care este motivul frânelor? Uneori se întâmplă situații mai complexe: pe serverul de producție API-ul este foarte lent, dar pe banca unde are loc dezvoltarea totul este în regulă. Și du-te și vezi ce nu merge bine. Depanarea pe un server de producție este un grad extrem de deznădejde, la care, desigur, este mai bine să nu ducem.

Pentru astfel de situații au fost inventate instrumente speciale numite profileri de aplicații. În lumea PHP, acest rol este jucat de xDebug, precum și de xhprof. xhprof este un instrument mai ușor, mai simplu și mai flexibil, așa că utilizarea lui este de preferat. Interesant, xhprof a fost dezvoltat de Facebook în 2009, dar încă nu există suport oficial pentru php7 de la ei și nu va mai exista, deoarece Facebook a trecut la HHVM. Cu toate acestea, datorită comunității extinse de dezvoltatori PHP, a apărut o furcă care acceptă PHP7, a cărei instalare nu provoacă dificultăți.

Instalare

Mai întâi trebuie să instalați efectiv xhprof:

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

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

Dosarul /var/tmp/xhprof trebuie să aibă acces de scriere, deoarece rezultatele profilării vor fi salvate acolo.

Puteți reîncărca PHP-FPM și verifica dacă extensia este instalată. Este banal, acest lucru se poate face folosind rezultatul funcției phpinfo();

xhprof este instalat, îl puteți folosi. Pachetul xhprof include o interfață foarte ușor de utilizat pentru analiza rapoartelor de profilare. xhprof vă permite să construiți rapoarte, atât sub formă de text, cât și în formă grafică. Folderul de instalare xhprof conține xhprof_html și xhprof_lib, de care vom avea nevoie. Folder xhprof_html - oferă acces la GUI. xhprof_lib - bibliotecă pentru afișarea și analiza codului. Este recomandabil să mutați întregul folder xhprof în /var/www/xhprof și să configurați o gazdă virtuală pentru acesta, de exemplu xhprof.loc. Exemplu pentru nginx:

Server ( asculta 80; server_name xhprof.loc; charset utf-8; root /var/www/xhprof/xhprof_html; index index.php; locație / ( try_files $uri $uri/ /index.php?q=$uri&$args ; ) locație ~ \.php ( fastcgi_pass 127.0.0.1:9000; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params;)

De asemenea, trebuie să vă amintiți să actualizați fișierul hosts. Acum, când introducem adresa URL xhprof.loc în browser, vom fi duși la interfața web a profilerului, unde vor fi disponibile fișierele generate de acesta.

Acum puteți trece direct la profilarea codului.

Pentru a activa profiler, utilizați funcția xhprof_enable(), care acceptă următoarele indicatoare ca intrare:

  • XHPROF_FLAGS_CPU - pentru înregistrarea statisticilor procesorului;
  • XHPROF_FLAGS_MEMORY - pentru memorie;
  • XHPROF_FLAGS_NO_BUILTINS - pentru a ignora funcțiile încorporate.

Pentru a dezactiva profiler, utilizați funcția xhprof_disable(). Pentru comoditate, vom scrie două scripturi header.php și footer.php care îndeplinesc aceste funcții. header.php este inclus la începutul scriptului profilat, iar footer.php - la sfârșit. footer.php este, de asemenea, responsabil pentru stocarea datelor de profilare.

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 = "NUMELE PROFILED_SCRIPT AICI"; $xhprofData = xhprof_disable(); $xhprofRuns = new XHProfRuns_Default($xh_Default); profRuns->save_run ($xhprofData, $profilerNamespace);
Utilizare

Având conectat header.php și footer.php la scriptul profilat, puteți începe: la executarea script-ului profilat, va fi generat un fișier care va fi salvat în directorul /var/tmp/xhprof, care conține informații despre funcționarea scenariu. Când deschideți interfața web xhprof.loc, acest fișier generat va fi disponibil:


Când deschideți un fișier de profilare, apar informații detaliate despre funcționarea aplicației, întreaga stivă de apeluri:


Ce înseamnă coloanele:

  • Apeluri- numărul și procentajul apelurilor de funcții;
  • Incl. Timp de zid- timpul de executie al unei functii cu functii imbricate;
  • Excl. Timp de zid- timpul de executie al unei functii fara functii imbricate;
  • Incl. CPU- Timp CPU cu funcții imbricate;
  • Excl. CPU- Timp CPU fără funcții imbricate;
  • Incl. MemUse- consum de memorie cu funcții imbricate;
  • Excl. MemUse- consum de memorie fara functii imbricate;
  • Incl. PeakMemUse- consum maxim de memorie cu funcții imbricate;
  • Excl. PeakMemUse- consum maxim de memorie fără funcții imbricate.

Dacă urmați linkul, va fi afișat un arbore de apeluri frumos cu o indicație vizuală a codului cel mai lent. Dacă acest lucru nu se întâmplă, atunci cel mai probabil trebuie să instalați biblioteca graphviz:

Apt-get install graphviz

Un exemplu de grafic construit:

În cazul meu, blocajul este interacțiunea cu baza de date.


Utilizarea xhprof pe un server de producție

Inițial, xhprof a fost dezvoltat special în scopul profilării codului în luptă, pe serverele de producție. Pur și simplu nu există un alt instrument gratuit și eficient pentru profilarea codului PHP7 în luptă, așa că xhprof nu are concurenți. Mai exact, am experiență în utilizarea xhprof pe un server de producție care procesează un milion de solicitări pe zi. Folosește php7 și nu au fost găsite probleme până acum. Cu toate acestea, xhprof nu este rulat pentru fiecare solicitare - ar genera prea multe fișiere de profilare. Pentru mine, profilerul pornește numai dacă cererea are antetul „XHPROF_ENABLE” și este setat la adevărat. De asemenea, puteți utiliza o altă strategie, de exemplu, rulați profilerul în mod aleatoriu cu o probabilitate de, să zicem, 1/1000. Apoi va fi și o imagine destul de clară.


Concluzie

Chiar dacă xhprof nu este acceptat oficial pentru php7, este totuși un instrument indispensabil pentru un dezvoltator php.

Acesta a arătat cum să instalați și să configurați xdebug și a acoperit câteva caracteristici de bază, cum ar fi îmbunătățirea rezultatului funcției var_dump() sau tipărirea unei urmăriri a stivei de apeluri la primirea unui mesaj de eroare. În a doua parte, ne-am uitat la această caracteristică xdebug ca urmărire. Urmărirea conține toate apelurile la funcții și metode din program, timpul de pornire, opțional dimensiunea memoriei, parametrii trecuți și returnați. Un jurnal de urmărire vă poate ajuta să înțelegeți calea de execuție a unui program complex. În loc să inserați codul de depanare în program, activați sau dezactivați urmărirea acolo unde este necesar, apoi utilizați utilitare precum grep sau propriile aplicații PHP pentru a analiza fișierul jurnal.

În acest articol ne vom uita la profilare. La prima vedere, profilarea este similară cu urmărirea. Jurnalul de profilare nu este destinat oamenilor, nu este destinat să vizualizeze fluxul unui program, dar ne oferă date pentru analiza statistică a unui program care rulează.

Crearea unui jurnal de profilare

Mai jos este un scurt fragment din jurnalul de profilare generat de xdebug:

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


După cum puteți vedea, jurnalul de profilare nu poate fi citit direct. Vom folosi instrumente suplimentare pentru a vizualiza și analiza datele obținute. Deci, profilarea arată de câte ori a fost lansată o anumită linie și cât timp a durat lansarea.
Crearea unui jurnal de profilare degradează foarte mult performanța, similar cu crearea unui jurnal de urmărire, deoarece trebuie să descrii trecerea fiecărei linii. Prin urmare, la fel ca și în cazul urmăririi, nu rulați profilarea pe serverele de producție... Cu toate acestea, există cazuri când profilarea trebuie să fie rulată pe un sistem live. În acest caz, aveți grijă să rulați xdebug simultan cu alte extensii Zend, cum ar fi încărcătoare, optimizatoare sau cache.
Pentru ca xdebug să înceapă înregistrarea jurnalelor de profilare, adăugați

Vă rugăm să rețineți că nu puteți rula profilarea în timpul pornirii rulând o comandă.
Deoarece jurnalul de profilare este destinat să fie citit de programele de analiză, nu există setări suplimentare care vă permit să afișați informații suplimentare, așa cum este cazul jurnalului de urmărire. Cu toate acestea, există unele setări care vă permit să configurați profilarea, similare cu cele pe care le-am folosit la configurarea urmăririi.
În primul rând, xdebug scrie jurnalul de profilare în directorul /tmp în mod implicit. Dacă utilizați Windows, trebuie să remediați php.ini, astfel:
xdebug.profiler_output_dir="c:\traces"

În mod implicit, xdebug suprascrie jurnalul de profilare existent. Îl puteți configura pentru a-l completa pe cel existent adăugând următoarea comandă

în php.ini. Există cazuri în care nu doriți să creați un jurnal de profilare pentru toate fișierele, dar, în același timp, activarea profilării în timpul execuției este problematică. În loc să activați și să dezactivați periodic profilarea, adăugați comanda
xdebug.profiler_enable_trigger=Activat

în php.ini. Acum puteți activa și dezactiva profilarea prin transmiterea unui parametru special GET sau POST XDEBUG_PROFILE unui script PHP. Aceasta va activa profilarea numai pentru acest script PHP. Nu este necesar să setați valoarea acestui parametru, nu uitați să adăugați acest parametru la adresa test.php?XDEBUG_PROFILE.

Nume jurnal de profilare

Numele pe care xdebug îl atribuie jurnalului de profilare în mod implicit este „cachegrind.out”. plus identificatorul de proces. La fel ca și în cazul jurnalului de urmărire, puteți schimba numele jurnalului adăugând setările corespunzătoare la php.ini. Nume parametru xdebug.profiler_output_name. Argumentul este un șir. care poate conţine diverşi modificatori. Cele mai importante sunt mai jos:

  • %p – identificatorul procesului
  • %r – număr aleator
  • %u - timp
  • %H – valoarea lui $_SERVER[„HTTP_HOST”]
  • %R – valoarea lui $_SERVER[„REQUEST_URI”]
  • %s – numele, inclusiv calea completă, barele oblice sunt convertite în litere de subliniere
Vă rugăm să rețineți că modificatorul %s este folosit doar pentru xdebug.profiler_output_name. Dacă doriți să aflați numele jurnalului de profilare, puteți apela funcția xdebug_get_profiler_filename().

Analiza jurnalului de profilare
După cum am menționat mai sus, pentru a analiza jurnalul de profilare, sunt necesare programe suplimentare pentru vizualizarea datelor. Toate jurnalele de profilare pe care le creează xdebug sunt într-un format similar cu formatul Cachegrind. Cachegrind este un profiler care face parte dintr-un program mai puternic numit Valgrind, un program software de depanare și profilare pentru Linux. Cachegrind a fost conceput pentru a analiza statisticile cache-urilor, utilizarea memoriei și comenzile programului. Un alt instrument Valgrind, Callgrind, desenează grafice de apel. În ceea ce privește PHP, putem folosi această aplicație pentru a vizualiza și analiza jurnalul de profilare.
Instrumentul care este utilizat în mod obișnuit pentru a analiza jurnalul de profilare generat de xdebug se numește . KCachegrind este un software liber licențiat conform GPL (funcționează numai pe sisteme Unix). Cu toate acestea, există un program simplu pentru Windows, care este și gratuit. Să ne uităm mai întâi la versiunea Windows.

WinCacheGrind: analiza jurnalelor de profilare în Windows

Versiunea actuală (la momentul scrierii de către autorul acestui articol) a WinCachegrind este 1.0.0.12. Această versiune datează din 2005, ceea ce înseamnă că WinCachegrind nu a fost dezvoltat de mult timp. Dacă te uiți la notele de lansare, autorii scriu că programul are bug-uri care uneori îl fac să se comporte ciudat.
Prin urmare, recomand să utilizați KCachegrind, lansat pe baza unei mașini virtuale pe cea mai recentă distribuție Linux, de exemplu Ubuntu (nota traducătorului, în general vorbind, o recomandare ciudată; în acest caz, aș recomanda doar instalarea Linux, și nu gard în grădina mașinilor virtuale). Există un număr mare de mașini virtuale disponibile sub Windows. Dacă nu este posibil să utilizați Unix sau o mașină virtuală dintr-un anumit motiv, puteți continua să utilizați WinCachegrind pentru o analiză simplă a jurnalului de profilare. WinCachegrind nu desenează grafice de apel, spre deosebire de KCachegrind.
Instalarea Wincachegrind este extrem de ușoară. Rulați programul de instalare, faceți clic pe butonul pentru a accepta licența și instalarea este completă. Acum puteți rula programul și deschide unul dintre jurnalele de profilare cachegrind create de xdebug.

Făcând clic pe ceas sau pe pictograma sigma, puteți comuta între afișarea informațiilor în valori absolute și procente. Afișajul procentual arată cât timp, ca procent din timpul total, este nevoie pentru a apela o funcție dintr-un anumit bloc.
Două setări utile sunt Profiler -> Hide Fast Functions și Profiler -> Hide Library Functions. Primul comutator ascunde funcții a căror contribuție în timp la timpul general de execuție a programului este nesemnificativă.
A doua setare, Profiler -> Hide Library Functions, ascunde funcțiile încorporate în PHP din analiza generală. Când ambele setări sunt activate, vedeți mai puține date, permițându-vă să vă concentrați asupra zonelor din cod care necesită optimizare.
Fereastra principală conține două file: Linie cu linie și General. Ambele file afișează aceleași informații, dar fila Overall reunește informațiile pentru o prezentare mai bună. Timpul propriu afișează timpul de rulare al codului în blocul curent, în timp ce Timpul cumulativ (Cum.) arată timpul total de rulare al funcțiilor din blocul dat.

KCacheGrind: analiza jurnalelor de profilare în Unix

Versiunea Unix a KCachegrind oferă mai multe funcționalități decât WinCachegrind. KCachegrind vizualizează datele și construiește un grafic de apel.
Pentru a începe să-l utilizați, trebuie să instalați KCachegrind. Versiune curentă . Este disponibilă o versiune mai nouă (0.10.1), dar face parte din pachetul Valgrind.
Dacă este posibil, utilizați un manager de pachete pentru a instala pachetul KCachegrind. KCachegrind folosește GraphViz pentru a desena grafice de apel, așa că trebuie să instalați și pachetul GraphViz dacă managerul de pachete nu instalează automat pachetele dependente.
Dacă nu găsiți pachetul binar KCachegrind, va trebui să compilați singur KCachegrind. După descărcarea surselor, rulați

./configure --prefix=/opt/kde3
face
face instalarea

După cum puteți observa, trebuie să specificați calea către instalarea curentă a bibliotecii KDE. Dacă nu știți unde se află bibliotecile KDE pe sistemul dvs., utilizați

pentru a afișa calea către bibliotecile KDE.
Odată instalat, puteți rula KCacheGrind din linia de comandă

Afișarea tabelară a datelor în KCachegrind este foarte asemănătoare cu WinCachegrind. De asemenea, puteți comuta între valori absolute și procentuale. Unele caracteristici KCachegrind nu sunt concepute pentru PHP. Imaginea de mai jos arată graficul apelurilor programului phpMyAdmin:


După cum puteți vedea, cea mai mare parte a timpului de pornire a fost petrecut în common.inc.php. Următoarea captură de ecran arată o vizualizare a apelurilor de funcții în interiorul common.inc.php:

Acest bloc de cod rulează două require_onces, adică jumătate din timpul necesar pentru a rula common.inc.php. Făcând dublu clic pe orice dreptunghi, veți aprofunda analiza datelor.

Optimizarea codului pe baza datelor de profilare

Întotdeauna profilați aplicațiile înainte de optimizare. Optimizarea o poti incepe singur, in locul in care ti se pare ca aceasta optimizare va aduce un efect, dar acest lucru nu este intotdeauna adevarat. Optimizarea are efect în principal numai în acele părți care necesită cel mai mult timp în procesul de execuție.
Dacă executați mai multe copii ale unui program în același timp, poate fi necesar să optimizați partea din program care ocupă cea mai mare parte a timpului de execuție. În acest caz, optimizarea nu va face servirea unei cereri individuale mai rapidă, dar va permite serverului dvs. să gestioneze sarcini mari, consumând în același timp mai puține resurse pentru a deservi aceste solicitări.
Când vă uitați la duratele rulării profilerului, rețineți că valorile absolute sunt mai puțin importante decât valorile relative. Măsurate pe diferite sisteme, valorile absolute pot varia. Cu toate acestea, înainte de a începe optimizarea codului, luați în considerare următoarele lucruri.
O regulă importantă în optimizare este reducerea numărului de operațiuni I/O. Unele operațiuni I/O necesită mult timp în comparație cu calculele. Reducerea unor astfel de operațiuni poate fi o modalitate foarte eficientă de a vă accelera programul. Eliminarea unui apel I/O poate oferi o îmbunătățire mai eficientă decât petrecerea multor ore pentru optimizarea codului. Prin urmare, ar trebui să vă concentrați mai întâi pe operațiunile I/O înainte de a începe codarea.
De asemenea, puteți crește numărul de servere înainte de optimizare. Puteți cumpăra unul uriaș, care vă va oferi o mică creștere a productivității. Timpul de dezvoltare este mai scump decât prețul unui server nou. Și dacă creșteți cantitatea de hardware, puteți fi sigur că veți obține imediat creșterea fără niciun impact asupra codului PHP. Când un dezvoltator petrece una sau două zile optimizând codul, nu poți spune niciodată cât de mult va crește productivitatea. Și până la urmă, nu mai poți fi sigur că optimizarea nu va aduce nicio eroare.
Conversia unor pagini în pagini statice este o modalitate de a obține performanțe mai bune. Să presupunem că există un site cu mult trafic, unde un script PHP creează prima pagină pentru fiecare solicitare, selectând informații dintr-o bază de date sau fișier XML. Dacă datele de pe o pagină se modifică suficient de frecvent, puteți recrea o copie statică a acesteia. Dacă conversia într-o vizualizare statică nu este posibilă pentru o pagină (pe pagină sunt afișate unele informații personale), puteți converti unele blocuri în vizualizare statică.
Un alt nivel de optimizare nu necesită schimbarea codului PHP. După cum știm, PHP este un limbaj interpretat. Aceasta înseamnă că comenzile sale sunt traduse în timpul execuției în cod intermediar. Transmisia se repetă de fiecare dată când rulează scriptul. Acest lucru face ca PHP să fie mai lent în comparație cu limbaje precum C sau Java, care nu necesită analizarea codului de fiecare dată când îl rulați. Pentru PHP, puteți folosi cache-urile de reprezentare intermediară (vezi traducerea mea....) pentru a salva și reutiliza codul intermediar, acest lucru face pornirea și execuția mai rapide.
Toate acestea nu înseamnă că nu este momentul sau locul pentru optimizarea codului PHP. Unele optimizări ale codului pot îmbunătăți considerabil performanța. Cu toate acestea, amintiți-vă întotdeauna că schimbarea codului implică întotdeauna riscul de a introduce erori suplimentare și probleme de securitate. De asemenea, rețineți că optimizarea codului îl face mai puțin lizibil.

Concluzie

Crearea și vizualizarea unui jurnal de profilare este una dintre condițiile importante pentru optimizarea codului PHP. Trebuie să știți care locuri din program iau cel mai mult timp și de aici ar trebui să începeți optimizarea.
În articolul următor ne vom uita la depanarea folosind xdebug. xdebug vă poate oferi posibilitatea de a face depanare la distanță. Folosind un client care are această capacitate, cum ar fi Eclipse PDT, puteți să vă depanați codul fără a-l schimba, să setați puncte de întrerupere, să treceți prin secțiuni de cod și să vedeți cum și unde variabilele își schimbă valorile.

Cele mai bune articole pe această temă