Regelmatig krijg ik van mijn opdrachtgevers het verzoek om te bepalen waarom een bepaalde PHP applicatie niet voldoende performance heeft. Om iets zinnigs over de performance bottlenecks in je applicatie te kunnen zeggen moet je gaan meten hoe lang PHP er over doet om bepaalde instructies uit te voeren. In dit document probeer ik uit te leggen uit dat globaal in zijn werk gaat.







Wat heb je nodig?

Om een applicatie te kunnen profilen heb je een tweetal tools nodig

Onder Ubuntu kun je deze installeren via de volgende twee commando's:

sudo apt-get install php5-xdebug
sudo apt-get install kcachegrind






Configureren

Je kunt de xdebug profiler aanzetten door de volgende regels toe te voegen aan php.ini

//hiermee zet je de xdebug profiler aan
xdebug.profiler_enable=1

//De volgende opties zijn optioneel
xdebug.profiler_enable_trigger=1
xdebug.profiler_output_name="timestamp"

Enable trigger zorgt ervoor dat de applicatie aan een profile log aanmaakt indien de URL parameter XDEBUG_PROFILE
wordt meegegeven. Je kunt dus zelf bepalen welk script je wilt profilen. Profiler_output_name zorgt ervoor dat de profile log een timestamp in de bestandsnaam heeft zodat je snel kunt zien welke log de juiste is.

Als alles goed geinstalleerd is dan zal in de output van phpinfo() het volgende te zien zijn:

xdebug.profiler_append Off Off
xdebug.profiler_enable On On
xdebug.profiler_enable_trigger Off Off
xdebug.profiler_output_dir /tmp /tmp
xdebug.profiler_output_name cachegrind.out.%p cachegrind.out.%p






Een simpel voorbeeld

In het onderstaande voorbeeld zie je eens stukje script dat verbinding maakt met een MySQL database en een aantal records opvraagt

function test2()
{
mysql_connect('localhost','username','secret');
mysql_select_db('mysql');
$queryresult=mysql_query("select * from help_keyword");
while ($row=mysql_fetch_object($queryresult))
{
print_r($row);
}
}

test2();
?>

Als je dit script uitvoert via je browser dan wordt er in de /tmp folder een cachegrind.out bestand gegenereerd. Dit bestand kan geopend worden met Cachegrind. In Cachegrind krijg je dan het volgende scherm te zien:







Je kunt nu per functie zien hoeveel processortijd het kost om hem uit te voeren. Hierdoor krijg je goed zicht op de functies die het meeste vertraging in je script veroorzaken.





Meer informatie over dit onderwerp