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
- Xdebug
- Cachegrind (Kcachegrind voor Linux, WinCachegrind voor Windows)
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() 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);
}
}
?>
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.
Comments