PHP koda profilēšana. XHProf un xDebug - PHP koda profilēšana Izmantojot papildu tulka parametrus

xhprof instalēšana php:

Sudo apt-get instalēt php5-xhprof

Restartējiet Apache:

Sudo pakalpojuma apache2 restartēšana

Drukāt phpinfo(); un pārbaudiet, vai modulis ir pievienots vai nav?

Mēs pārbaudām /etc/php5/apache2/conf.d, lai redzētu, vai tur nav redzama saite uz xhprof.ini konfigurāciju.

Ja nē, izveidojiet saiti pats un restartējiet Apache.

Sudo ln -s /etc/php5/mods-available/xhprof.ini /etc/php5/apache2/conf.d/20-xhprof.ini sudo pakalpojuma apache2 restartēšana

Mēs pārbaudām xhprof savienojumu, pārbaudiet, vai ir pievienots 20-xhprof.ini:

Ekrānuzņēmumā ir redzama versija 0.9.2, lai gan instalēšanas laikā tika parādīta versija 0.9.4, bet tas mums nav šķērslis.

Tagad mēs varam profilēt savu kodu.

  1. Lapas sākumā iespējojiet profilēšanu, izmantojot xhprof_enable();
  2. Lapas beigās izslēdziet profilēšanu, izmantojot xhprof_disable() un saglabājiet savāktos datus, izmantojot save_run();
  3. Tālāk mēs analizējam.

Funkcija xhprof_enable() izmanto karogus kā argumentus:

XHPROF_FLAGS_CPU procesora statistikas ierakstīšanai,

XHPROF_FLAGS_MEMORY — atmiņai,

XHPROF_FLAGS_NO_BUILTINS - lai ignorētu iebūvētās funkcijas.

Lai saglabātu un sniegtu papildu informāciju, mums ir jāinstalē profila analīzes rīks.

Lejupielādējiet arhīvu ar analīzes rīku no lapas xhprof:, paņemiet versiju 0.9.4.

Serverī vai lokālajā datorā izveidojiet mapi, kurai var piekļūt, izmantojot localhost vai atsevišķu domēnu, kurā mēs izsaiņojam lejupielādēto arhīvu:

Tagad mēs varam saglabāt profilu.

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

Izsekošanas kods izskatās apmēram šādi:

// Inicializēt profilētāju - skaitīsim gan procesora laiku, gan atmiņas patēriņu xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
// Profilētais kods # Apturēt profilētāju $xhprof_data = xhprof_disable(); # Saglabājiet pārskatu un ģenerējiet saiti, lai to skatītu include_once "/var/www/html/xhprof-0.9.4/xhprof_lib/utils/xhprof_lib.php"; include_once "/var/www/html/xhprof-0.9.4/xhprof_lib/utils/xhprof_runs.php"; $xhprof_runs = jauns XHProfRuns_Default(); $run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_test"); echo "Ziņojums: http://localhost/xhprof-0.9.4/xhprof_html/index.php?run=$run_id&source=xhprof_test"; atbalss "\n";

/var/www/html/xhprof-0.9.4 - ceļš uz mapi, kurā mēs izpakojām vajadzīgās bibliotēkas.

Pārskats: http://localhost/xhprof-0.9.4/xhprof_html/index.php?run=57c32f3095d21&source=xhprof_test

Šādi izskatās profila analīze. Šajā tabulā ir parādīti visi profilētie funkciju izsaukumi.

Funkcijas varam sakārtot, noklikšķinot uz tabulas virsrakstiem.

Kad mēs redzam, ka kāda funkcija tiek izpildīta daudzas reizes vai ļoti ilgu laiku, mēs varam noklikšķināt uz šīs funkcijas, un tiks atvērta līdzīga tabula, bet ar iekšējiem izsaukumiem attiecīgajā funkcijā un vecākvidē, kurā funkcija tika izsaukta.

Rādītāji:
Total Inc. Wall Time (laiks, kas pavadīts funkciju izpildei, ņemot vērā atbildes gaidīšanu no ligzdām, failu sistēmas un citiem resursiem)
Total Inc. CPU (funkciju izpildei pavadītais laiks)
Total Inc. MemUse (atmiņas lietojums)
Total Inc. PeakMemUse (maksimālais atmiņas lietojums)
Funkciju zvanu skaits

Ir arī iespēja grafiski parādīt pārskatu. Bet, lai to izdarītu, jums ir jāpārliecinās, ka jums ir instalēta graphviz bibliotēka:

Apt-get install graphviz

Pēc tam savā profilā jums jānoklikšķina, lai parādītu, un voila:

Tagad jūs varat analizēt un uzlabot kodu.

FirePHP ir firebug paplašinājums, kas kopā ar mazo php klasi ļauj pārraidīt datus no php, piemēram, visu veidu var_dump un citu atkļūdošanas informāciju, uz firebug konsoli. Šī paplašinājuma galvenā priekšrocība ir tā, ka visa atkļūdošanas informācija tiek pārraidīta caur galvenēm un nekaitē lapām un nekādā veidā nepārkāpj lietojumprogrammas loģiku. Oficiālā vietne: http://firephp.org/.

Galvenā doma.

Vispārējais profilēšanas algoritms ir šāds:
  1. Lapas sākumā mēs iespējojam profilēšanu, izmantojot xhprof_enable()
  2. Lapas beigās izslēdziet profilēšanu, izmantojot xhprof_disable() un saglabājiet savāktos datus, izmantojot save_run()
  3. Tālāk, izmantojot firephp php klasi, mēs nododam saiti uz profilēšanas datiem klienta daļai
  4. Firebug konsolē atveram nepieciešamo informāciju
  5. Priecājamies :)
Es arī gribētu teikt, ka, protams, manuāli pievienot šīs funkcijas saviem PHP skriptiem ir lieliski. Bet es vēlos, lai šī informācija vienmēr būtu pie rokas izstrādes laikā un nenonāktu uz ražošanas serveriem. Mēs risinām šo problēmu šādi:

Mūsu projektos gandrīz visos skriptos sākumā tiek pieslēgts darba fails ar klases ielādētāju, savienojošām funkcijām un citām nepieciešamām lietām. Tāpēc mēs iekļāvām profilēšanas iekļaušanu šajā failā. Un, lai pēc vēlēšanās varētu ieslēgt/izslēgt atkļūdošanas režīmu, mēs pievienojām konfigurācijas konstantes pārbaudi, kā arī iekļāvām šīs pārbaudes dažos metatagos, kas tiek automātiski noņemti, kad projekts ir izveidots. Tas pats attiecas uz profilēšanas izslēgšanu un informācijas rakstīšanu galvenēs, izmantojot firephp – šos uzdevumus risina viena funkcija, kas tiek izsaukta katra PHP skripta beigās un arī tiek ietīta meta tagos. Tas izskatās apmēram šādi:

// Lietojumprogrammas konfigurācijas failā ir ierakstītas šādas konstantes

/** Vides darbības režīms * */
define("APPLICATION_ENV" , "dev"); // dev - atkļūdošana | pro - ražošana
/** Ceļš uz profilētāju */
define("XHPROF_ROOT" , __DIR__. "/ExtProcs/debug/xhprof-0.9.2");

/***************************************************************************************
* Tālāk failā, kas tiek ielādēts katra skripta sākumā, mēs palaižam profilēšanu
* DEV_START un DEV_END ir mūsu metatagi, viss starp tiem tiek izgriezts montāžas laikā
***************************************************************************************/

//-- DEV_START
//-- atkļūdošanas režīmā savienojam atkļūdošanas bibliotēkas

// Ielādēt firephp
prasīt_vienreiz (__DIR__ . "/includes/ExtProcs/debug/firephp/FirePHP.class.php");
//-- ielādē profilētāju
"/xhprof_lib/utils/xhprof_lib.php");
prasīt_vienreiz(XHPROF_ROOT. "/xhprof_lib/utils/xhprof_runs.php");
// Inicializēt profilēšanu ar nepieciešamajiem karodziņiem. Detalizēts karogu apraksts
// var atrast vietnē php.net/manual/ru/xhprof.constants.php
xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
}
//-- DEV_END

// Šī funkcija tiek izsaukta katra skripta beigās
// Tā zvans ir aplauzts arī DEV_START un DEV_END

/**
* Izveidojiet saiti uz profilēšanas rezultātu un parādiet to konsolē
*/
funkcija dev_boot_Down() (
if (APPLICATION_ENV === "izstrādātājs" ) (
// Inicializējiet firephp instanci
$firephp = FirePHP::getInstance(true);
// Izslēdziet profilēšanu un saglabājiet datus
$xhprof_data = xhprof_disable();
$xhprof_runs = jauns XHProfRuns_Default();
$run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_testing" );
// Izveidojiet saiti uz profilēšanas datiem un ierakstiet to konsolē
$saite = "http://" . $_SERVER["HTTP_HOST"] . "/includes/ExtProcs/debug/xhprof-0.9.2/xhprof_html/index.php?run=($run_id)&source=xhprof_testing\n";
$firephp->info($saite, "profilēšanas dati" );
}
}


* Šis avota kods tika izcelts, izmantojot avota koda izcelšanas rīku.

Es neiedziļināšos šo paplašinājumu instalēšanas detaļās, jo šeit viss ir vienkāršs. Es teikšu tikai par dažiem iestatīšanas aspektiem. xhproof ir tikai viens konfigurācijas mainīgais - xhprof.output_dir, kas norāda uz mapi, kurā tiks saglabāti profilēšanas dati. Tāpēc pārliecinieties, vai lietotājam, kuram tiek izpildīti PHP skripti, ir rakstīšanas tiesības norādītajā direktorijā. Tātad savā php.ini ierakstiet kaut ko līdzīgu šim:


paplašinājums=xhprof.so
xhprof.output_dir="/var/tmp/xhprof"

Ir arī ieteicams instalēt kaut ko līdzīgu, piemēram, punktu vai Graphviz, lai zīmētu zvanu diagrammas. Man ir Graphviz operētājsistēmā MacOS X.

Pabeidzot iepriekš aprakstītās procedūras, mēs jebkurā laikā varējām atvērt un apskatīt jebkura mūsu skripta profilēšanu tieši pārlūkprogrammā.

Lietojumprogrammu profilēšana ir datu vākšana par dažādu programmas sadaļu (failu un funkciju) izpildes ātrumu. Ir pieejami daudzi PHP profilēšanas rīki, taču ne visi rīki ir piemēroti analīzes veikšanai tieši ražošanas vietā.

XHProf un tā dakša Tideways ir ērts un vienkāršs profilētājs, kas var efektīvi apkopot statistiku par lietojumprogrammas darbību, gandrīz nemazinot jūsu lietojumprogrammas (vai vietnes) ātrumu.

Kāpēc profila kods?

Ja aplikācija sāk darboties lēni (lasi “vietne sāka palēnināties”), profilēšana ļaus noskaidrot, kura daļa ir vislēnākā. Profilēšanas rezultāts parasti ir izpildīto funkciju saraksts kopā ar to izpildes laiku.

Lietojumprogrammas optimizācijas procesā koda profilēšanai jābūt pirmajā vietā. Jebkas cits būtu minējums un, visticamāk, nepareizs. Jums jāzina, kas tieši izraisa problēmas un "bremzes".

Profilēšana ir statistikas apkopošanas un kārtošanas procedūra par koda izpildes laiku. Tas nav optimizācijas vai programmas modifikācijas process. Šī procesa rezultāts parasti ir paplašināts ziņojums par programmas komponentiem un funkciju veiktspējas statistiku.

Tieši tam tika izstrādāts XHProf risinājums. Tas ir paredzēts darbam reālās vietnēs. Šī profilētāja galvenā ideja ir radīt minimālu slodzi lietojumprogrammai, vienlaikus apkopojot visus nepieciešamos datus par darbības ātrumu. Risinājumu izstrādājuši Facebook speciālisti.

Kā automātiski pieslēgt php profilētāju?

Mūsu speciālisti ir smagi strādājuši un padarījuši šo procesu pilnībā automatizētu.
Jums vienkārši jāpiesakās, cilnē "Domēni" atlasiet vajadzīgo domēnu, noklikšķiniet uz ikonas "PHP.INI + PHP Profiler" un iespējojiet izvēles rūtiņu "Domain Profiler".

Šīs funkcijas iespējošana var aizņemt kādu laiku, parasti ne vairāk kā 10 minūtes.

Php versijām 5.2, 5.3, 5.4, 5.5, 5.6, 7.0 mēs izmantojam XHProf profilētāju, php versijām 7.1 un jaunākām versijām izmantojam Tideways profilētāju.

Kad tas ir iespējots, katrā jūsu vietnes lapā, ko apstrādā PHP, tās apakšdaļā tiks iebūvēts īpašs bloks ar saitēm uz pārskata failu (saite izskatīsies apmēram šādi:

Domain-name.com/xhprof-master/xhprof_html/index.php?run=XXXXXXXXXXXX&source=someapp)

Lūk, kā izskatīsies pārskata fails:

Tabulā ir iekļauts vienā lapā veikto funkciju saraksts ar papildu informāciju:

  • Zvani - funkciju zvanu skaits un procentuālā daļa
  • Ieskaitot Wall Time - funkcijas izpildes laiks ar ligzdotām funkcijām
  • Izņemot Wall Time - funkcijas izpildes laiks bez ligzdotām funkcijām
  • Ieskaitot CPU - procesora laiks ar ligzdotām funkcijām
  • Izņemot CPU - procesora laiks bez ligzdotām funkcijām
  • Ieskaitot MemUse - atmiņas patēriņš ar ligzdotām funkcijām
  • Izņemot MemUse - atmiņas patēriņš bez ligzdotām funkcijām
  • Ieskaitot PeakMemUse - maksimālais atmiņas patēriņš ar ligzdotām funkcijām
  • Izņemot PeakMemUse - maksimālais atmiņas patēriņš bez ligzdotām funkcijām

Jāpiebilst, ka atskaite, kas veidota, izmantojot plūdmaiņas, var nedaudz vizuāli atšķirties no šīs atskaites, taču būtība nemainās.

Grafiskās atskaites


Resursu ietilpīgās koda sadaļas ir iezīmētas dzeltenā (vidēja) un sarkanā (smagākā) krāsā. Šīs ir tās koda sadaļas, kas izmanto daudz resursu salīdzinājumā ar pārējo programmu. Tā var būt viena lēna funkcija vai daudzi ātrās funkcijas izsaukumi. Mūsu piemērā mēs redzam, ka funkcija mysqli_multi_query() ir atzīmēta sarkanā krāsā, jo tā darbojas vislēnāk.

Apkopotie pārskati

XHProf interfeiss arī ļauj vienlaikus skatīt apkopoto informāciju no vairākiem pārskatiem. Lai to izdarītu, run_id tiek nodots, atdalot to ar komatiem:

Domain-name.com/xhprof-master/xhprof_html/index.php?run=XXXXXXXXXXXX,YYYYYYYYYYY&source=someapp

Tehniskās īpašības

    Automātiska profilētāja iekļaušana tiek īstenota, izmantojot auto_append_file un auto_prepend_file direktīvas, kas savieno divus izpildāmos php failus:

    — auto_append_file inicializē statistikas vākšanas objektu un sāk darbu;

    — auto_prepend_file pabeidz statistikas vākšanu un ģenerē atskaites failu ar statistiku (JSON formātā);

    Ja skripta darbības laikā tiek izsaukts exit() vai die(), auto_prepend_file netiks izpildīts. statistikas fails netiks ģenerēts un bloks ar saitēm uz atskaites failu netiks iekļauts lapas apakšā.

  1. Tādējādi, piekļūstot jebkurai php apstrādātai lapai, tiks izveidots jauns atskaites fails, tāpēc iesakām pēc statistikas apkopošanas (parasti pēc dažām stundām) atspējot profilētāju, lai izvairītos no diska kvotas pārpildes, kas var tikt izsmelta pēc liels skaits ziņojumu!
  2. Svarīgi: profilētājs darbosies tikai tad, ja vietne ir pievienota serverim, izmantojot standarta ceļu, automātiski (tas ir, izmantojot hostinga vadības paneli), pretējā gadījumā jums ir jāsazinās ar Hostland tehnisko atbalstu, lai konfigurētu profilētāju.
  3. Automātiskajā režīmā profilētājs izveido savienojumu tikai ar galveno domēna nosaukumu; profilētājs netiek automātiski savienots ar apakšdomēniem.
  4. Automātiskajā režīmā profilētājs apkopo statistiku tikai par skriptiem ar paplašinājumu .php un .php5
  5. Pēc PHP profilētāja pievienošanas nav iespējams garantēt vietnes nepārtrauktu darbību, tādēļ, ja vietne nedarbojas pareizi, kamēr profilētājs ir iespējots, tā ir jāatspējo un profilēšana jāturpina ar citiem līdzekļiem.

Apkoposim to

Mēs ceram, ka šis rīks palīdzēs padarīt jūsu vietnes vēl ātrākas Hostland mitināšanā.

Rakstā daļēji izmantoti vietnē ievietotā lietotāja Den Golotyuk materiāli

Tajā tika parādīts, kā instalēt un konfigurēt xdebug, un apskatītas dažas pamata funkcijas, piemēram, funkcijas var_dump() izvades uzlabošana vai izsaukuma steka izsekošanas drukāšana, saņemot kļūdas ziņojumu. Otrajā daļā mēs aplūkojām šo xdebug funkciju kā izsekošanu. Izsekošana satur visus izsaukumus uz funkcijām un metodēm programmā, startēšanas laiku, pēc izvēles atmiņas lielumu, nodotos un atgrieztos parametrus. Izsekošanas žurnāls var palīdzēt izprast sarežģītas programmas izpildes ceļu. Tā vietā, lai programmā ievietotu atkļūdošanas kodu, jūs ieslēdzat vai izslēdzat izsekošanu, kur nepieciešams, un pēc tam izmantojiet utilītas, piemēram, grep vai savas PHP lietojumprogrammas, lai analizētu žurnālfailu.

Šajā rakstā mēs apskatīsim profilēšanu. No pirmā acu uzmetiena profilēšana ir līdzīga izsekošana. Profilēšanas žurnāls nav paredzēts cilvēkiem, tas nav paredzēts, lai vizualizētu programmas plūsmu, bet tas sniedz mums datus darbojošās programmas statistiskai analīzei.

Profilēšanas žurnāla izveide

Tālāk ir sniegts īss izvilkums no profilēšanas žurnāla, ko ģenerēja xdebug:

fl=php:iekšējais
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
zvani=1 0 0
13 6
cfn=php::define
zvani=1 0 0
18 4
cfn=php::define
zvani=1 0 0
23 2


Kā redzat, profilēšanas žurnālu nevar tieši nolasīt. Iegūto datu vizualizēšanai un analīzei izmantosim papildu rīkus. Tātad profilēšana parāda, cik reižu konkrēta līnija tika palaista un cik ilgi palaišana notika.
Profilēšanas žurnāla izveide ievērojami pasliktina veiktspēju, līdzīgi kā izsekošanas žurnāla izveidošana, jo ir jāapraksta katras rindas pāreja. Tāpēc, tāpat kā izsekošanas gadījumā, nedarbiniet profilēšanu ražošanas serveros... Tomēr ir gadījumi, kad profilēšana ir jāpalaiž dzīvā sistēmā. Šādā gadījumā esiet piesardzīgs, vienlaikus palaistot xdebug ar citiem Zend paplašinājumiem, piemēram, ielādētājiem, optimizētājiem vai kešatmiņām.
Lai xdebug sāktu ierakstīt profilēšanas žurnālus, pievienojiet

Lūdzu, ņemiet vērā, ka startēšanas laikā nevar palaist profilēšanu, izpildot komandu.
Tā kā profilēšanas žurnāls ir paredzēts analizatora programmu lasīšanai, nav papildu iestatījumu, kas ļautu parādīt papildu informāciju, kā tas ir izsekošanas žurnāla gadījumā. Tomēr ir daži iestatījumi, kas ļauj konfigurēt profilēšanu, līdzīgi tiem, ko izmantojām, iestatot izsekošanu.
Pirmkārt, xdebug pēc noklusējuma ieraksta profilēšanas žurnālu /tmp direktorijā. Ja izmantojat Windows, jums ir jālabo php.ini, piemēram:
xdebug.profiler_output_dir="c:\traces"

Pēc noklusējuma xdebug pārraksta esošo profilēšanas žurnālu. Varat to konfigurēt, lai papildinātu esošo, pievienojot šādu komandu

php.ini. Ir gadījumi, kad nevēlaties izveidot profilēšanas žurnālu visiem failiem, bet tajā pašā laikā profilēšanas aktivizēšana izpildlaikā ir problemātiska. Tā vietā, lai periodiski ieslēgtu un izslēgtu profilēšanu, pievienojiet komandu
xdebug.profiler_enable_trigger=Ieslēgts

php.ini. Tagad varat ieslēgt un izslēgt profilēšanu, PHP skriptam nosūtot īpašu GET vai POST parametru XDEBUG_PROFILE. Tādējādi tiks iespējota profilēšana tikai šim PHP skriptam. Nav nepieciešams iestatīt šī parametra vērtību, vienkārši atcerieties pievienot šo parametru adresei test.php?XDEBUG_PROFILE.

Profilēšanas žurnāla nosaukums

Nosaukums, ko xdebug piešķir profilēšanas žurnālam pēc noklusējuma, ir “cachegrind.out”. plus procesa identifikators. Tāpat kā izsekošanas žurnāla gadījumā, varat mainīt žurnāla nosaukumus, pievienojot atbilstošos iestatījumus php.ini. Parametra nosaukums xdebug.profiler_output_name. Arguments ir virkne. kas var saturēt dažādus modifikatorus. Vissvarīgākie ir norādīti zemāk:

  • %p – procesa identifikators
  • %r – nejaušs skaitlis
  • %u — laiks
  • %H — $_SERVER["HTTP_HOST"] vērtība
  • %R — $_SERVER["REQUEST_URI"] vērtība
  • %s — nosaukums, ieskaitot pilnu ceļu, slīpsvītras tiek pārvērstas pasvītros
Lūdzu, ņemiet vērā, ka %s modifikators tiek izmantots tikai xdebug.profiler_output_name. Ja vēlaties uzzināt profilēšanas žurnāla nosaukumu, varat izsaukt funkciju xdebug_get_profiler_filename().

Profilēšanas žurnālu analīze
Kā minēts iepriekš, lai analizētu profilēšanas žurnālu, ir nepieciešamas papildu programmas datu vizualizācijai. Visi profilēšanas žurnāli, ko izveido xdebug, ir formātā, kas līdzīgs Cachegrind formātam. Cachegrind ir profilētājs, kas ir daļa no jaudīgākas programmas Valgrind — programmatūras atkļūdošanas un profilēšanas programmai Linux. Cachegrind tika izstrādāts, lai analizētu kešatmiņu statistiku, atmiņas izmantošanu un programmu komandas. Vēl viens Valgrind rīks Callgrind zīmē zvanu grafikus. Attiecībā uz PHP mēs varam izmantot šo lietojumprogrammu, lai vizualizētu un analizētu profilēšanas žurnālu.
Rīks, ko parasti izmanto, lai analizētu xdebug ģenerēto profilēšanas žurnālu, tiek saukts par . KCachegrind ir bezmaksas programmatūra, kas licencēta saskaņā ar GPL (darbojas tikai Unix sistēmās). Tomēr operētājsistēmai Windows ir vienkārša programma, kas arī ir bezmaksas. Vispirms apskatīsim Windows versiju.

WinCacheGrind: profilēšanas žurnālu analīze sistēmā Windows

Pašreizējā WinCachegrind versija (šī raksta autora rakstīšanas laikā) ir 1.0.0.12. Šī versija ir datēta ar 2005. gadu, kas nozīmē, ka WinCachegrind nav izstrādāts ilgu laiku. Ja paskatās izlaiduma piezīmes, autori raksta, ka programmā ir kļūdas, kas dažreiz liek tai uzvesties dīvaini.
Tāpēc es iesaku izmantot KCachegrind, kas palaists uz virtuālās mašīnas bāzes jaunākajā Linux distribūcijā, piemēram, Ubuntu (tulkotāja piezīme, vispārīgi runājot, dīvains ieteikums; šajā gadījumā es ieteiktu vienkārši instalēt Linux, nevis iežogot virtuālo mašīnu dārzs). Operētājsistēmā Windows ir pieejams milzīgs skaits virtuālo mašīnu. Ja kāda iemesla dēļ nav iespējams izmantot Unix vai virtuālo mašīnu, varat turpināt izmantot WinCachegrind vienkāršai profilēšanas žurnālu analīzei. WinCachegrind atšķirībā no KCachegrind nezīmē izsaukuma grafikus.
Wincachegrind instalēšana ir ļoti vienkārša. Palaidiet instalētāju, noklikšķiniet uz pogas, lai apstiprinātu licenci, un instalēšana ir pabeigta. Tagad varat palaist programmu un atvērt vienu no xdebug izveidotajiem cachegrind profilēšanas žurnāliem.

Noklikšķinot uz pulksteņa vai sigma ikonas, varat pārslēgties starp informācijas rādīšanu absolūtās vērtībās un procentos. Procentuālais displejs parāda, cik daudz laika procentos no kopējā laika nepieciešams, lai izsauktu funkciju noteiktā blokā.
Divi noderīgi iestatījumi ir Profiler -> Slēpt ātrās funkcijas un Profiler -> Slēpt bibliotēkas funkcijas. Pirmais slēdzis slēpj funkcijas, kuru laika ieguldījums kopējā programmas izpildes laikā ir nenozīmīgs.
Otrais iestatījums Profiler -> Hide Library Functions paslēpj PHP iebūvētās funkcijas no vispārējās analīzes. Kad abi šie iestatījumi ir iespējoti, tiek rādīts mazāk datu, ļaujot koncentrēties uz koda jomām, kurām nepieciešama optimizācija.
Galvenajā logā ir divas cilnes: Rinda pa rindiņai un Kopumā. Abās cilnēs tiek rādīta viena un tā pati informācija, taču cilnē Kopumā informācija tiek apkopota labākai prezentācijai. Pašlaiks parāda koda darbības laiku pašreizējā blokā, bet kumulatīvs laiks (Cum.) parāda kopējo funkciju darbības laiku dotajā blokā.

KCacheGrind: profilēšanas žurnālu analīze sistēmā Unix

KCachegrind Unix versija nodrošina vairāk funkcionalitātes nekā WinCachegrind. KCachegrind vizualizē datus un izveido izsaukuma grafiku.
Lai sāktu to lietot, jāinstalē KCachegrind. Pašreizējā versija . Ir pieejama jaunāka versija (0.10.1), taču tā ir daļa no Valgrind pakotnes.
Ja iespējams, izmantojiet pakotņu pārvaldnieku, lai instalētu KCachegrind pakotni. KCachegrind izmanto GraphViz, lai zīmētu izsaukuma grafikus, tāpēc ir jāinstalē arī GraphViz pakotne, ja pakotņu pārvaldnieks automātiski neinstalē atkarīgās pakotnes.
Ja neatrodat KCachegrind bināro pakotni, jums būs jākompilē KCachegrind pašam. Pēc avotu lejupielādes palaidiet

./configure --prefix=/opt/kde3
veidot
veikt instalēšanu

Kā jūs varat atzīmēt, jums ir jānorāda ceļš uz pašreizējo KDE bibliotēkas instalāciju. Ja nezināt, kur jūsu sistēmā atrodas KDE bibliotēkas, izmantojiet

lai parādītu ceļu uz KDE bibliotēkām.
Pēc instalēšanas varat palaist KCacheGrind no komandrindas

Datu attēlojums tabulā KCachegrind ir ļoti līdzīgs WinCachegrind. Varat arī pārslēgties starp absolūtajām un procentuālajām vērtībām. Daži KCachegrind līdzekļi nav paredzēti PHP. Zemāk esošajā attēlā ir parādīta programmas phpMyAdmin zvanu diagramma:


Kā redzat, lielākā daļa startēšanas laika tika pavadīta vietnē common.inc.php. Šis ekrānuzņēmums parāda funkciju izsaukumu vizualizāciju vietnē common.inc.php:

Šis koda bloks palaiž divus prasību_onces, kas ir uz pusi mazāk laika, kas nepieciešams, lai palaistu common.inc.php. Veicot dubultklikšķi uz jebkura taisnstūra, jūs padziļināsit datu analīzi.

Koda optimizācija, pamatojoties uz profilēšanas datiem

Pirms optimizēšanas vienmēr profilējiet savas lietojumprogrammas. Jūs varat sākt optimizāciju pats, vietā, kur jums šķiet, ka šī optimizācija dos efektu, taču tas ne vienmēr ir taisnība. Optimizācija galvenokārt ietekmē tikai tās daļas, kas izpildes procesā aizņem visvairāk laika.
Ja vienlaikus palaižat daudzas programmas kopijas, iespējams, joprojām būs jāoptimizē tā programmas daļa, kas aizņem lielāko daļu izpildes laika. Šādā gadījumā optimizācija nepadarīs ātrāku viena atsevišķa pieprasījuma apkalpošanu, bet ļaus jūsu serverim apstrādāt lielas slodzes, vienlaikus patērējot mazāk resursu šo pieprasījumu apkalpošanai.
Aplūkojot profilētāja darbības ilgumus, ņemiet vērā, ka absolūtās vērtības ir mazāk svarīgas nekā relatīvās vērtības. Mērot dažādās sistēmās, absolūtās vērtības var atšķirties. Tomēr, pirms sākat optimizēt kodu, apsveriet tālāk norādītās lietas.
Svarīgs optimizācijas noteikums ir I/O operāciju skaita samazināšana. Dažas I/O darbības ir ļoti laikietilpīgas, salīdzinot ar aprēķiniem. Šādu darbību samazināšana var būt ļoti efektīvs veids, kā paātrināt programmu. Viena I/O zvana noņemšana var nodrošināt efektīvāku uzlabojumu, nekā tērējot daudz stundu koda optimizēšanai. Tāpēc pirms kodēšanas vispirms jākoncentrējas uz I/O operācijām.
Pirms optimizācijas varat arī palielināt savu serveru skaitu. Jūs varat iegādāties milzīgu, kas dos jums nelielu produktivitātes pieaugumu. Izstrādes laiks ir dārgāks nekā jauna servera cena. Un, ja palielināsiet aparatūras apjomu, varat būt pārliecināti, ka palielinājumu saņemsiet nekavējoties, neietekmējot PHP kodu. Ja izstrādātājs pavada vienu vai divas dienas, optimizējot kodu, jūs nekad nevarat pateikt, cik daudz produktivitāte palielināsies. Un galu galā jūs vairs nevarat būt drošs, ka optimizācija neradīs nekādas kļūdas.
Dažu lapu pārvēršana par statiskām lapām ir viens no veidiem, kā panākt labāku veiktspēju. Pieņemsim, ka ir vietne ar lielu trafiku, kur PHP skripts katram pieprasījumam izveido pirmo lapu, atlasot informāciju no datu bāzes vai XML faila. Ja dati lapā mainās pietiekami bieži, varat atkārtoti izveidot to statisku kopiju. Ja lapai nav iespējama pārveidošana statiskā skatā (lapā tiek parādīta noteikta personiskā informācija), dažus blokus varat pārvērst statiskā skatā.
Cits optimizācijas līmenis neprasa mainīt PHP kodu. Kā mēs zinām, PHP ir interpretēta valoda. Tas nozīmē, ka tās komandas izpildes laikā tiek tulkotas starpkodā. Pārraide tiek atkārtota katru reizi, kad tiek izpildīts skripts. Tas padara PHP lēnāku salīdzinājumā ar tādām valodām kā C vai Java, kurām nav nepieciešama koda parsēšana katru reizi, kad to palaižat. PHP varat izmantot starpposma reprezentācijas kešatmiņas (skatiet manu tulkojumu...), lai saglabātu un atkārtoti izmantotu starpposma kodu, tas padara startēšanu un izpildi ātrāku.
Tas viss nenozīmē, ka šis nav īstais laiks vai vieta PHP koda optimizēšanai. Dažas koda optimizācijas var ievērojami uzlabot veiktspēju. Tomēr vienmēr atcerieties, ka koda maiņa vienmēr rada papildu kļūdu un drošības problēmu risku. Atcerieties arī, ka, optimizējot kodu, tas kļūst mazāk lasāms.

Secinājums

Profilēšanas žurnāla izveide un vizualizēšana ir viens no svarīgiem PHP koda optimizēšanas nosacījumiem. Jums jāzina, kuras programmas vietas aizņem visvairāk laika, un tieši tur jums vajadzētu sākt optimizāciju.
Nākamajā rakstā mēs apskatīsim atkļūdošanu, izmantojot xdebug. xdebug var nodrošināt jums iespēju veikt attālo atkļūdošanu. Izmantojot klientu, kuram ir šī iespēja, piemēram, Eclipse PDT, varat atkļūdot savu kodu, to nemainot, iestatīt pārtraukuma punktus, pāriet pa koda sadaļām un redzēt, kā un kur mainīgie maina vērtības.

Ir pieejams PHP paplašinājums Xdebug, lai palīdzētu profilēt PHP lietojumprogrammas, kā arī veikt atkļūdošanu izpildlaikā. Palaižot profilētāju, izvade tiek ierakstīta failā binārā formātā ar nosaukumu "cachegrind". Katrā platformā ir pieejamas lietojumprogrammas šo failu analīzei. Lai veiktu šo profilēšanu, lietojumprogrammas kods nav jāmaina.

Lai iespējotu profilēšanu, instalējiet paplašinājumu un pielāgojiet php.ini iestatījumus. Dažiem Linux izplatījumiem ir standarta pakotnes (piemēram, Ubuntu pakotne php-xdebug). Mūsu piemērā profils tiks palaists pēc izvēles, pamatojoties uz pieprasījuma parametru. Tas ļauj saglabāt iestatījumus statiskus un ieslēgt profilētāju tikai pēc vajadzības.

# php.ini iestatījumi # Iestatiet uz 1, lai to ieslēgtu katram pieprasījumam. xdebug.profiler_enable = 0 # Izmantosim GET/POST parametru, lai ieslēgtu profilētāju xdebug.profiler_enable_trigger = 1 # GET/POST vērtība, ko mēs nodosim ; tukšs jebkurai vērtībai xdebug.profiler_enable_trigger_value = "" # Izvadiet kešatmiņas failus uz /tmp, lai mūsu sistēma tos vēlāk iztīrītu. xdebug.profiler_output_dir = "/tmp" xdebug.profiler_output_name = "cachegrind.out.%p"

Pēc tam izmantojiet tīmekļa klientu, lai pieprasītu savas lietojumprogrammas URL, kuru vēlaties profilēt, piemēram,

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

Lapai apstrādājot, tā tiks ierakstīta failā ar līdzīgu nosaukumu

/tmp/cachegrind.out.12345

Pēc noklusējuma numurs faila nosaukumā ir procesa ID, kas to ierakstīja. To var konfigurēt ar iestatījumu xdebug.profiler_output_name.

Ņemiet vērā, ka tas ierakstīs vienu failu katram PHP pieprasījumam/procesam, kas tiek izpildīts. Tātad, piemēram, ja vēlaties analizēt veidlapas ziņu, viens profils tiks uzrakstīts GET pieprasījumam, lai parādītu HTML veidlapu. Parametrs XDEBUG_PROFILE būs jānodod nākamajā POST pieprasījumā, lai analizētu otro pieprasījumu, kas apstrādā veidlapu. Tāpēc, veicot profilēšanu, dažreiz ir vieglāk palaist curl, lai tieši POSTĪT veidlapu.

Izvades analīze

Pēc uzrakstīšanas profila kešatmiņu var nolasīt lietojumprogramma, piemēram, vai Webgrind. PHPStorm, populārs PHP IDE, var arī parādīt šos profilēšanas datus.

Piemēram, KCachegrind parādīs informāciju, tostarp:

  • Funkcijas izpildītas
  • Zvana laiks, gan pats par sevi, gan ieskaitot turpmākos funkciju izsaukumus
  • Katras funkcijas izsaukšanas reižu skaits
  • Zvanu grafiki
  • Saites uz pirmkodu

Ko meklēt

Acīmredzot veiktspējas regulēšana ir ļoti specifiska katras lietojumprogrammas lietošanas gadījumiem. Kopumā ir labi meklēt:

  • Atkārtoti izsaukumi vienai un tai pašai funkcijai, ko jūs nevarētu redzēt. Funkcijām, kas apstrādā un vaicā datus, tās varētu būt galvenās iespējas jūsu lietojumprogrammai saglabāt kešatmiņu.
  • Lēnas darbības funkcijas. Kur lietojumprogramma pavada lielāko daļu sava laika? vislabākā atdeve veiktspējas regulēšanā ir koncentrēties uz tām lietojumprogrammas daļām, kas patērē visvairāk laika.

Piezīme: Xdebug un jo īpaši tā profilēšanas līdzekļi ir ļoti resursietilpīgi un palēnina PHP izpildi. Nav ieteicams tos palaist ražošanas servera vidē.