Si të konfiguroni telefonat inteligjentë dhe PC. Portali informativ
  • në shtëpi
  • Windows 10
  • Profilizimi i PHP me XHProf - një mjet profesional për zhvilluesit e aplikacioneve në ueb. Profilizimi dhe korrigjimi i aplikacioneve PHP me xhprof & FirePHP Duke aktivizuar profilin e Xdebug

Profilizimi i PHP me XHProf - një mjet profesional për zhvilluesit e aplikacioneve në ueb. Profilizimi dhe korrigjimi i aplikacioneve PHP me xhprof & FirePHP Duke aktivizuar profilin e Xdebug

Profilizimi i kodit PHP

Herët a vonë, secili prej nesh përballet me kodin e trashëguar dhe optimizimin e tij. Në një situatë të tillë, një korrigjues dhe një profilizues janë asistentët më të mirë të programuesit. Për ata që punojnë me PHP, falë Derick Rethans, ekziston një mjet i mirë - xDebug. Ka shumë informacione në lidhje me xDebug edhe në RuNet, kështu që ky artikull nuk do të jetë në lidhje me të.

Kur hasa në një përmendje të një profili për PHP, menjëherë mendova për xDebug (i kisha harruar shumë kohë më parë mjetet e pronarit nga Zend), por këtë herë gabova - do të flasim për XHProf.
XHProf

Ky profilues u zhvillua posaçërisht për Facebook, dhe kodi i tij burimor u hap në mars 2009.

Instalimi shkoi mjaft shpejt dhe pa probleme.
wget pecl.php.net/get/xhprof-0.9.2.tgz
tar xvf xhprof-0.9.2.tgz
cd xhprof-0.9.2/extension/
phpize
./konfiguro && bëj && bëj instalimin
cd /usr/local/etc/php.d/
vim xhprof.ini
cd /usr/local/
koka e vim.php
vimfooter.php
vim etj/php.ini
/etc/init.d/php-fpm rinisni
cp vhost.conf.shabllon prof.my.conf
sed -i s/site/prof/ prof.my.conf
vim prof.my.conf
/etc/init.d/nginx rinisje

Le të analizojmë konfigurimet e përmendura

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 - Konfigurimi Nginx - më standardi.

Serveri (
dëgjo 80;
emri i serverit prof.my;
grup karakteresh utf8;

Root /usr/local/src/xhprof-0.9.2/xhprof_html;
vendndodhja/(
indeksi i indeksit.php;
}

Vendndodhja ~ \.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;
përfshijnë fastcgi_params;

Në /usr/local/src/xhprof-0.9.2/xhprof_html ka burime PHP që krijojnë një WEBGUI të mirë për profilin.

Pra, në lidhje me dy skedarët kryesorë:

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"]))(
nëse (extension_loaded ("xhprof")) (
$profiler_namespace = "myapp"; // hapësira e emrit për aplikacionin tuaj
$xhprof_data = xhprof_disable();
$xhprof_runs = i ri XHProfRuns_Default();
$run_id = $xhprof_runs->ruaj_run($xhprof_data, $profiler_namespace);

// url në bibliotekat e ndërfaqes së përdoruesit XHProf (ndryshoni emrin dhe shtegun e hostit)
$profiler_url = sprintf("http://prof.my/index.php?run=%s&source=%s", $run_id, $profiler_namespace);
jehonë<<Prodhimi i profilit
JASHTË;
}
}

Tani ne ekzekutojmë çdo skript PHP përmes ueb-it dhe shohim në këndin e sipërm të majtë një lidhje me daljen e profilit - kjo është pikërisht ajo për të cilën u krijua hosti prof.my.

Ju lutemi vini re - Unë përdor kontrollimin e COOKIE! Me një kontroll të tillë, ju mund të përdorni me siguri profilin në një server prodhimi - në të dhëna reale dhe ngarkesë reale.

Ndërfaqja e internetit e profilit shfaq shenja me informacione për secilin funksion dhe raporton informacionin e mëposhtëm:

  • Numri i thirrjeve për secilin funksion
  • Koha në mur, koha e shpenzuar për ekzekutimin e funksioneve (përfshirë pritjen e përgjigjeve nga bazat, sistemi i skedarëve, etj.).
  • Koha e CPU-së, koha e shpenzuar për ekzekutimin e funksioneve (duke përjashtuar pritjen e përgjigjeve nga bazat, sistemi i skedarëve, etj.).
  • Përdorimi i memories
  • Përdorimi maksimal i memories

Është e mundur të renditni tabelën sipas ndonjë prej parametrave

Informacioni për secilin funksion ndahet në dy lloje të tjera: Gjithëpërfshirës dhe Ekskluziv. Përfshirja përfshin shifrat e përdorura nga telefonatat e fëmijëve, ndërsa Exclusive nuk i përfshin ato. Gjithashtu është e mundur të klikoni mbi emrin e një funksioni për të parë informacionin vetëm mbi të dhe funksionet nga të cilat është thirrur dhe cilat janë thirrur prej tij.

Nëse GraphViz është i instaluar në sistem, profiluesi do të vizatojë një grafik thirrjesh për ju.

P.S. Pa thyer traditat: ky është postimi im i parë në Habré.

UPD: ripostuar në PHP.

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ë. Asnjë ndryshim i kodit të aplikacionit nuk është i nevojshëm 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). Në shembullin tonë ne do ta ekzekutojmë profilin opsionalisht bazuar në një parametër të kërkesës. Kjo na lejon të mbajmë cilësimet statike dhe të aktivizojmë profiluesin vetëm sipas nevojës.

# php.ini settings # Vendos në 1 për ta aktivizuar 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ë; bosh 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 në internet 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'i shihnit. Për funksionet që përpunojnë dhe kërkojnë të dhëna, këto mund të jenë mundësitë kryesore që aplikacioni juaj të ruhet në memorie.
  • 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-së. Rekomandohet që këto të mos ekzekutohen në një mjedis serveri prodhimi.

Profilizimi i aplikacionit është mbledhja e të dhënave për shpejtësinë e ekzekutimit të seksioneve të ndryshme të programit (skedarët dhe funksionet). Ka shumë mjete të profilizimit PHP në dispozicion, por jo të gjitha mjetet janë të përshtatshme për kryerjen e analizave direkt në prodhim.

XHProf- një profilues mega i thjeshtë që mbledh statistika drejtpërdrejt ndërsa aplikacioni funksionon pa pothuajse asnjë shpenzim.

Pse profili?

Nëse një aplikacion fillon të funksionojë ngadalë, profilizimi mund t'ju ndihmojë të zbuloni se cila pjesë është e ngadaltë. Rezultati i profilizimit është zakonisht një listë e funksioneve të ekzekutuara dhe koha e ekzekutimit të tyre.

Profilizimi duhet të bëhet përpara çdo optimizimi të aplikacionit. Përndryshe, do të udhëhiqeni nga supozimet. Me shumë mundësi e gabuar.

Problemi i debutimit

Xdebug është një zgjidhje e fuqishme për PHP. Por vetë platforma Xdebug është aq e rëndë saqë nuk mund të përdoret në sajte të drejtpërdrejta. XDebug krijon një ngarkesë të konsiderueshme në burimet e serverit dhe ngadalëson aplikacionin.

Nga ana tjetër, problemet në një sajt të drejtpërdrejtë mund të jenë krejtësisht të ndryshme nga ato në një mjedis zhvillimi. Profilizimi vetëm në kompjuterët zhvillues do të tregojë vetëm një pjesë të problemeve.

Kjo është arsyeja pse zgjidhja u zhvillua XHprof. Është menduar për t'u përdorur në aplikime në ekzekutim. Ideja kryesore e këtij profilisti është të krijojë një ngarkesë minimale në aplikacion duke mbledhur të gjitha të dhënat e nevojshme për shpejtësinë e funksionimit. Zgjidhja u zhvillua nga djemtë nga Facebook dhe mbështetet nga versionet e reja të PHP.

XHProf

Instalimi

Në Debian XHprof është në paketat sid, kështu që: apt-get instalo xhprof

Ju gjithashtu mund të ndërtoni XHprof vetë.

Aktivizo profilizimin

Le të themi se kemi një skript me kodin e mëposhtëm:

ekzekutoni ();

Le të kryejmë profilizimin duke përdorur XHprof. Për ta bërë këtë në këtë faqe ju duhet:

  1. Aktivizo profilin që në fillim.
  2. Në fund të programit, ndaloni profilin dhe ruani të dhënat e marra.

Do të duket kështu:

# Inicializoni profilinxhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY); # Ekzekutoni programin pasi të keni ndezur profilin ekzekutoni (); # Ndalo profilin pas ekzekutimit të programit$xhprof_data = xhprof_disable();

# Ruani rezultatin e profilizimit në variablin $xhprof_data

  • Funksioni xhprof_enable() merr flamujt si argumente. XHPROF_FLAGS_CPU për regjistrimin e statistikave të procesorit, XHPROF_FLAGS_MEMORY për memorien, XHPROF_FLAGS_NO_BUILTINS për injorimin e funksioneve të integruara.
  • xhprof_disable() do të fikur profilin dhe do të kthejë statistikat e mbledhura.

Raportet

Brezi

Të dhënat e mbledhura mund të analizohen në ndërfaqen XHprof për të gjeneruar raporte. Për ta bërë këtë, ju duhet të shkarkoni burimet e 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

Pas kësaj, duhet të bëni ndryshime në skenar:

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

# Kodi i ri ruan raportin për përdorim në GUI

Ndërfaqja për raporte

Për të parë raportin, duhet të konfiguroni hostin virtual në dosjen /var/www/xhprof-0.9.4/xhprof_html. Për shembull, në Nginx:

Serveri ( emri_server xh..9.4/xhprof_html; index index.php; vendndodhja ~* \.(php)$ ( fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; përfshi fastcgi_params; fastcgi_param SCRIPT_FILE NAME_dong) -s ringarkoni

Pas kësaj, do të shfaqet një listë e raporteve:

Tabela përmban një listë të funksioneve që janë kryer brenda një faqeje me informacion shtesë:

  • Thirrjet — numri dhe përqindja e thirrjeve funksionale.
  • Përfshirë Wall Time - koha e ekzekutimit të një funksioni me funksione të ndërlidhura.
  • përjashtuar. Wall Time është koha e ekzekutimit të një funksioni pa funksione të ndërlidhura.
  • Përfshirë CPU - koha e procesorit me funksione të vendosura.
  • përjashtuar. CPU - koha e procesorit pa funksione të ndërlidhura.
  • Përfshirë MemUse - konsumi i memories me funksione të ndërlidhura.
  • përjashtuar. MemUse - konsumi i memories pa funksione të ndërlidhura.
  • Përfshirë PeakMemUse - konsumi maksimal i memories me funksione të ndërlidhura.
  • përjashtuar. PeakMemUse - konsumi maksimal i memories pa funksione të ndërlidhura.

Raportet grafike

Për të ndërtuar një raport grafik, sigurohuni që të keni të instaluar graphviz: apt-get install graphviz

Seksionet me burime intensive të kodit janë të theksuara me të verdhë (mesatare) dhe të kuqe (më të rëndë). Këto janë ato pjesë të kodit që përdorin shumë burime në krahasim me pjesën tjetër të programit. Ky mund të jetë një funksion i ngadaltë ose shumë thirrje për një funksion të shpejtë. Në shembullin tonë, funksioni str_replace()është shënuar me ngjyrë të kuqe për shkak të 262 thirrjeve.

Raportet agregate

Ndërfaqja XHprof ju lejon gjithashtu të shikoni informacionin e përgjithshëm nga disa raporte në të njëjtën kohë. Për ta bërë këtë, run_id kalohet i ndarë me presje: http://xh..php?run= 53a894f6d5d9b,53a894fcf126e&burimi=test

TL; DR

Përdorni XHprof për të profilizuar PHP direkt në prodhim.

Me kalimin e kohës, çdo programues PHP përballet me problemin e performancës së dobët të aplikacionit të tij. Mund të ndodhë që një faqe e caktuar po ngarkohet ngadalë ose përgjigja nga API po zgjat shumë. Dhe ndonjëherë është mjaft e vështirë të kuptosh se cila është arsyeja e frenave? Ndonjëherë ndodhin situata më komplekse: në serverin e prodhimit api është shumë i ngadalshëm, por në stolin ku zhvillohet zhvillimi gjithçka është në rregull. Dhe shko kupto se çfarë po shkon keq. Korrigjimi në një server prodhimi është një shkallë ekstreme e mungesës së shpresës, në të cilën, natyrisht, është më mirë të mos çoni.

Pikërisht për situata të tilla u shpikën mjete të posaçme të quajtur profilues të aplikacioneve. Në botën PHP, këtë rol e luan xDebug, si dhe xhprof. xhprof është një mjet më i lehtë, më i thjeshtë dhe më fleksibël, ndaj preferohet përdorimi i tij. Është interesante se xhprof u zhvillua nga facebook në vitin 2009, por ende nuk ka asnjë mbështetje zyrtare për php7 prej tyre dhe nuk do të ketë më pasi facebook ka kaluar në HHVM. Sidoqoftë, falë komunitetit të gjerë të zhvilluesve të PHP, është shfaqur një pirun që mbështet PHP7, instalimi i të cilit nuk shkakton ndonjë vështirësi.

Instalimi

Së pari ju duhet të instaloni 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"

Dosja /var/tmp/xhprof duhet të ketë akses shkrimi, sepse rezultatet e profilizimit do të ruhen atje.

Mund të ringarkoni PHP-FPM dhe të kontrolloni nëse shtesa është instaluar. Është e zakonshme, kjo mund të bëhet duke përdorur daljen e funksionit phpinfo();

xhprof është i instaluar, mund ta përdorni. Paketa xhprof përfshin një ndërfaqe shumë miqësore për përdoruesit për analizimin e raporteve të profilizimit. xhprof ju lejon të ndërtoni raporte, si në formë teksti ashtu edhe në formë grafike. Dosja e instalimit xhprof përmban xhprof_html dhe xhprof_lib, të cilat do të na duhen. Dosja xhprof_html - siguron qasje në GUI. xhprof_lib - bibliotekë për shfaqjen dhe analizimin e kodit. Këshillohet që të zhvendosni të gjithë dosjen xhprof në /var/www/xhprof dhe të konfiguroni një host virtual për të, për shembull xhprof.loc. Shembull për nginx:

Serveri ( dëgjo 80; emri i serverit xhprof.loc; grupi i karaktereve utf-8; rrënjë /var/www/xhprof/xhprof_html; indeksi index.php; vendndodhja / ( try_files $uri $uri/ /index.php?q=$uri&$args ; ) vendndodhja ~ \.php ( fastcgi_pass 127.0.0.1:9000; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_params; përfshi fastcgi_script_params;)_

Ju gjithashtu duhet të mbani mend të përditësoni skedarin e hosteve. Tani, kur futim URL-në xhprof.loc në shfletues, do të çojmë në ndërfaqen e internetit të profiluesit, ku do të jenë të disponueshëm skedarët e krijuar prej tij.

Tani mund të vazhdoni drejtpërdrejt me profilizimin e kodit.

Për të aktivizuar profilin, përdorni funksionin xhprof_enable(), i cili pranon flamujt e mëposhtëm si hyrje:

  • XHPROF_FLAGS_CPU - për regjistrimin e statistikave të procesorit;
  • XHPROF_FLAGS_MEMORY - për memorie;
  • XHPROF_FLAGS_NO_BUILTINS - për të injoruar funksionet e integruara.

Për të çaktivizuar profilin, përdorni funksionin xhprof_disable(). Për lehtësi, ne do të shkruajmë dy skripta header.php dhe footer.php që kryejnë këto funksione. header.php përfshihet në fillim të skriptit të profilizuar, dhe footer.php - në fund. footer.php është gjithashtu përgjegjës për ruajtjen e të dhënave të profilizimit.

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 = "EMRI I PROFILED_SCRIPT KETU"; $xhprofData = xhprof_disable(); fRuns->save_run ($xhprofData, $profilerNamespace);
Përdorimi

Pasi të keni lidhur header.php dhe footer.php me skriptin e profilizuar, mund të filloni: kur ekzekutoni skriptin e profilizuar, do të gjenerohet një skedar që do të ruhet në drejtorinë /var/tmp/xhprof, që përmban informacione rreth funksionimit të skenar. Kur hapni ndërfaqen në internet xhprof.loc, ky skedar i krijuar do të jetë i disponueshëm:


Kur hapni një skedar profilizimi, shfaqen informacione të detajuara në lidhje me funksionimin e aplikacionit, e gjithë grupi i thirrjeve:


Çfarë kuptimi kanë kolonat:

  • Thirrjet- numri dhe përqindja e thirrjeve të funksionit;
  • Përfshirë Koha e Murit- koha e ekzekutimit të një funksioni me funksione të ndërthurura;
  • përjashtuar. Koha e Murit- koha e ekzekutimit të një funksioni pa funksione të ndërlidhura;
  • Përfshirë CPU- Koha e CPU-së me funksione të ndërthurura;
  • përjashtuar. CPU- Koha e CPU-së pa funksione të ndërlidhura;
  • Përfshirë MemUse- konsumimi i memories me funksione të ndërlidhura;
  • përjashtuar. MemUse- konsumi i memories pa funksione të ndërlidhura;
  • Përfshirë PeakMemUse- konsumi maksimal i memories me funksione të ndërlidhura;
  • përjashtuar. PeakMemUse- konsumi maksimal i memories pa funksione të ndërlidhura.

Nëse ndiqni lidhjen, një pemë e bukur e thirrjeve do të shfaqet me një tregues vizual të kodit më të ngadaltë. Nëse kjo nuk ndodh, atëherë ka shumë të ngjarë që ju duhet të instaloni bibliotekën graphviz:

Apt-get install graphviz

Një shembull i një grafiku të ndërtuar:

Në rastin tim, pengesa është ndërveprimi me bazën e të dhënave.


Përdorimi i xhprof në një server prodhimi

Fillimisht, xhprof u zhvillua posaçërisht për qëllimin e profilizimit të kodit në luftim, në serverët e prodhimit. Thjesht nuk ka asnjë mjet tjetër falas dhe efektiv për profilizimin e kodit PHP7 në luftim, kështu që xhprof nuk ka konkurrentë. Konkretisht, unë kam përvojë duke përdorur xhprof në një server prodhimi që përpunon një milion kërkesa në ditë. Ai përdor php7 dhe nuk është gjetur asnjë problem deri më tani. Megjithatë, xhprof nuk ekzekutohet për çdo kërkesë - do të gjeneronte shumë skedarë profilizimi. Për mua, profiluesi fillon vetëm nëse kërkesa ka titullin "XHPROF_ENABLE" dhe është vendosur në "true". Ju gjithashtu mund të përdorni një strategji tjetër, për shembull, të ekzekutoni profilin rastësisht me një probabilitet, të themi, 1/1000. Atëherë do të ketë edhe një pamje mjaft të qartë.


konkluzioni

Edhe pse xhprof nuk mbështetet zyrtarisht për php7, ai është ende një mjet i domosdoshëm për një zhvillues php.

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 është e nevojshme të përshkruhet kalimi i ç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, kini kujdes për ekzekutimin e xdebug në të njëjtën kohë me shtesat e tjera Zend, të tilla si ngarkuesit, optimizuesit ose memoriet e fshehta.
Në mënyrë që xdebug të fillojë regjistrimin e regjistrave të profilizimit, shtoni

Ju lutemi vini re se nuk mund të ekzekutoni profilizimin në kohën e fillimit 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ë, pikat e pjerrëta 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ë makine 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ë cilave 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" i grumbullon informacionet 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 caktuar.

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ë ju 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ë krijuar për PHP. Fotografia më poshtë tregon grafikun e thirrjeve të 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ë funksionit 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. Duke klikuar dy herë 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 fillimisht në operacionet I/O 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 rrisni sasinë e harduerit, mund të jeni të sigurt se do ta merrni menjëherë rritjen pa ndonjë 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 e gabimeve 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 p.sh. 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.

Artikujt më të mirë mbi këtë temë