Zoeken…


Profilering met XHProf

XHProf is een PHP-profiler, oorspronkelijk geschreven door Facebook, om een lichter alternatief voor XDebug te bieden.

Na installatie van de xhprof PHP-module kan profilering vanuit PHP-code worden in- / uitgeschakeld:

xhprof_enable();
doSlowOperation();
$profile_data = xhprof_disable();

De geretourneerde array bevat gegevens over het aantal oproepen, CPU-tijd en geheugengebruik van elke functie waartoe toegang is verkregen binnen doSlowOperation() .

xhprof_sample_enable() / xhprof_sample_disable() kan worden gebruikt als een lichtere optie die alleen profileringsinformatie voor een fractie van aanvragen (en in een ander formaat) registreert.

XHProf heeft enkele (meestal ongedocumenteerde) helpfuncties om de gegevens weer te geven ( zie voorbeeld ), of u kunt andere hulpmiddelen gebruiken om het te visualiseren (de blog platform.sh heeft een voorbeeld ).

Geheugengebruik

PHP's runtime-geheugenlimiet wordt ingesteld via de INI-richtlijn memory_limit . Deze instelling voorkomt dat een enkele uitvoering van PHP teveel geheugen gebruikt, waardoor het uitgeput raakt voor andere scripts en systeemsoftware. De geheugenlimiet is standaard 128M en kan worden gewijzigd in het php.ini bestand of tijdens runtime. Het kan worden ingesteld om geen limiet te hebben, maar dit wordt over het algemeen als een slechte gewoonte beschouwd.

Het exacte geheugengebruik tijdens runtime kan worden bepaald door memory_get_usage() aan te roepen. Het geeft het aantal bytes geheugen terug dat is toegewezen aan het script dat momenteel wordt uitgevoerd. Vanaf PHP 5.2 heeft het een optionele booleaanse parameter om het totale toegewezen systeemgeheugen te verkrijgen, in tegenstelling tot het geheugen dat actief door PHP wordt gebruikt.

 <?php
 echo memory_get_usage() . "\n";
 // Outputs 350688 (or similar, depending on system and PHP version)

 // Let's use up some RAM
 $array = array_fill(0, 1000, 'abc');

 echo memory_get_usage() . "\n";
 // Outputs 387704

 // Remove the array from memory
 unset($array);

 echo memory_get_usage() . "\n";
 // Outputs 350784

Nu geeft memory_get_usage u geheugengebruik op het moment dat het wordt uitgevoerd. Tussen oproepen naar deze functie kunt u andere dingen in het geheugen toewijzen en dealloceren. memory_get_peak_usage() aan om de maximale hoeveelheid gebruikt geheugen tot een bepaald punt te memory_get_peak_usage() .

<?php
echo memory_get_peak_usage() . "\n";
// 385688
$array = array_fill(0, 1000, 'abc');
echo memory_get_peak_usage() . "\n";
// 422736
unset($array);
echo memory_get_peak_usage() . "\n";
// 422776

Merk op dat de waarde alleen omhoog gaat of constant blijft.

Profilering met Xdebug

Een uitbreiding van PHP genaamd Xdebug is beschikbaar om te helpen bij het profileren van PHP-toepassingen , evenals runtime-foutopsporing. Wanneer de profiler wordt uitgevoerd, wordt de uitvoer naar een bestand geschreven in een binair formaat met de naam "cachegrind". Op elk platform zijn applicaties beschikbaar om deze bestanden te analyseren.

Installeer de extensie en pas de php.ini-instellingen aan om profilering in te schakelen. In ons voorbeeld zullen we het profiel optioneel uitvoeren op basis van een aanvraagparameter. Hiermee kunnen we de instellingen statisch houden en de profiler alleen inschakelen als dat nodig is.

// Set to 1 to turn it on for every request
xdebug.profiler_enable = 0
// Let's use a GET/POST parameter to turn on the profiler
xdebug.profiler_enable_trigger = 1
// The GET/POST value we will pass; empty for any value
xdebug.profiler_enable_trigger_value = ""
// Output cachegrind files to /tmp so our system cleans them up later
xdebug.profiler_output_dir = "/tmp"
xdebug.profiler_output_name = "cachegrind.out.%p"

Gebruik vervolgens een webclient om een verzoek in te dienen bij de URL van uw applicatie die u wilt profileren, bijv

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

Terwijl de pagina wordt verwerkt, wordt naar een bestand geschreven met een naam die lijkt op

/tmp/cachegrind.out.12345

Merk op dat het één bestand zal schrijven voor elk PHP-verzoek / proces dat wordt uitgevoerd. Dus als u bijvoorbeeld een formulierpost wilt analyseren, wordt er één profiel geschreven voor het GET-verzoek om het HTML-formulier weer te geven. De parameter XDEBUG_PROFILE moet worden doorgegeven aan het volgende POST-verzoek om het tweede verzoek te analyseren dat het formulier verwerkt. Daarom is het bij het profileren soms gemakkelijker om krullen uit te voeren om rechtstreeks een formulier te POSTEN.

Na het schrijven kan de profielcache worden gelezen door een toepassing zoals KCachegrind.

KCachegrind

Dit geeft informatie weer, waaronder:

  • Functies uitgevoerd
  • Gesprekstijd, zowel zichzelf als inclusief volgende functieaanroepen
  • Aantal keren dat elke functie wordt aangeroepen
  • Grafieken oproepen
  • Links naar broncode

Het afstemmen van de prestaties is duidelijk zeer specifiek voor de gebruiksscenario's van elke toepassing. Over het algemeen is het goed om te zoeken naar:

  • Herhaalde oproepen naar dezelfde functie die u niet zou verwachten te zien. Voor functies die gegevens verwerken en opvragen, kunnen dit belangrijke kansen zijn voor uw toepassing om te cachen.
  • Langzaam lopende functies. Waar besteedt de applicatie het grootste deel van zijn tijd? de beste uitbetaling bij het afstemmen van prestaties is zich te concentreren op die delen van de applicatie die de meeste tijd verbruiken.

Opmerking : Xdebug, en met name de profileringsfuncties, zijn zeer resource-intensief en vertragen de uitvoering van PHP. Het wordt aanbevolen om deze niet in een productieserveromgeving uit te voeren.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow