PHP
Prestanda
Sök…
Profilering med XHProf
XHProf är en PHP-profil som ursprungligen skrivits av Facebook för att ge ett mer lätt alternativ till XDebug.
Efter installationen av xhprof
PHP-modulen kan profilering aktiveras / inaktiveras från PHP-kod:
xhprof_enable();
doSlowOperation();
$profile_data = xhprof_disable();
Den returnerade matrisen kommer att innehålla data om antalet samtal, CPU-tid och minnesanvändning för varje funktion som har åtkomst inom doSlowOperation()
.
xhprof_sample_enable()
/ xhprof_sample_disable()
kan användas som ett lättare alternativ som bara loggar profilinformation för en bråk av förfrågningar (och i ett annat format).
XHProf har några (mestadels icke-dokumenterade) hjälpfunktioner för att visa data ( se exempel ), eller du kan använda andra verktyg för att visualisera dem (platform.sh-bloggen har ett exempel ).
Minnesanvändning
PHP: s runtime-minne begränsas genom INI-direktivets memory_limit
. Denna inställning förhindrar att varje enskild exekvering av PHP använder för mycket minne och uttömmer det för andra skript och systemprogramvara. Minnesgränsen är standard till 128M och kan ändras i php.ini
filen eller vid körning. Det kan ställas in att det inte har någon gräns, men detta anses i allmänhet dålig praxis.
Den exakta minnesanvändningen som används under körning kan bestämmas genom att ringa memory_get_usage()
. Det returnerar antalet byte minne som tilldelats det nuvarande skriptet. Från PHP 5.2 har den en valfri boolesk parameter för att få det totala tilldelade systemminnet, i motsats till det minne som aktivt används av PHP.
<?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 ger memory_get_usage
dig minnesanvändning just nu det körs. Mellan samtal till den här funktionen kan du tilldela och omlokalisera andra saker i minnet. För att få den maximala mängden minne som används upp till en viss punkt, ring 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
Observera att värdet bara kommer att stiga upp eller förbli konstant.
Profilering med Xdebug
Ett tillägg till PHP som heter Xdebug är tillgängligt för att hjälpa till att profilera PHP-applikationer , samt runtime debugging. När profilen körs skrivs utgången till en fil i ett binärt format som kallas "cachegrind". Det finns applikationer på varje plattform för att analysera dessa filer.
För att möjliggöra profilering, installera tillägget och justera php.ini-inställningarna. I vårt exempel kör vi profilen valfritt baserat på en förfrågningsparameter. Detta gör att vi kan hålla inställningarna statiska och slå på profilen endast vid behov.
// 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"
Använd sedan en webbklient för att göra en begäran till din applikations URL som du vill profilera, t.ex.
http://example.com/article/1?XDEBUG_PROFILE=1
När sidan bearbetar kommer den att skriva till en fil med ett namn som liknar
/tmp/cachegrind.out.12345
Observera att den kommer att skriva en fil för varje PHP-begäran / -process som körs. Så, till exempel, om du vill analysera en formulärpost, kommer en profil att skrivas för GET-begäran för att visa HTML-formuläret. Parametern XDEBUG_PROFILE måste överföras till den efterföljande POST-begäran för att analysera den andra begäran som bearbetar formuläret. Därför är det ibland lättare att profilera curl till POST en formulär direkt när man profilerar.
När den har skrivits kan profilcachen läsas av ett program som KCachegrind.
Detta visar information inklusive:
- Funktioner utförda
- Samtalstid, både sig själv och inklusive påföljande funktionssamtal
- Antal gånger varje funktion anropas
- Ring diagram
- Länkar till källkod
Uppenbarligen är inställning av prestanda mycket specifik för varje applikations användningsfall. I allmänhet är det bra att leta efter:
- Upprepade samtal till samma funktion som du inte förväntar dig att se. För funktioner som bearbetar och frågedata kan dessa vara främsta möjligheter för din applikation att cache.
- Långsamma funktioner. Var tillbringar applikationen större delen av sin tid? den bästa vinsten för prestandatuning är att fokusera på de delar av applikationen som förbrukar mest tid.
Obs : Xdebug, och särskilt dess profilfunktioner, är mycket resurskrävande och bromsar PHP-körning. Det rekommenderas att inte köra dessa i en produktionsservermiljö.