xhprof est une extension à php opensource développé par Facebook qui a pour but de faire du profiling de code PHP. C’est un outil redoutable, pour peu qu’on sache bien l’utiliser, pour trouver les gouffres à ressources de votre application, et la rendre bien plus réactive.
$ tar xvfz xhprof-0.9.2.tgz
$ cd xhprof-0.9.2/
Compilation & installation de l’extension
$ phpize
Configuring for:
PHP Api Version: 20041225
Zend Module Api No: 20060613
Zend Extension Api No: 220060519
$ ./configure
[...]
$ make
[...]
$ make install
[...]
Il faut ensuite ajouter dans le php.ini la nouvelle section suivante (ou selon la distribution ou votre configuration, créer un fichier xhprof.ini avec celle ci):
extension=xhprof.so
; Chemin où seront créés les rapports
xhprof.output_dir=/tmp/xhprof
On créera bien évidement le répertoire, et comme les rapports seront générés par httpd, on lui permettra d’écrire dedans.
Il ne reste plus qu’à installer le code de visualisation xhprof. Pour cela, j’ai créé un virtualhost (xhprof.pm) dédié qui pointe dans /www/xhprof. On y copie le code de xhprof:
J’y ai aussi collé un script rapide pour mieux visualiser les reports disponibles (index.php):
echo "<b>Available reports</b><br /><br />";
$dir = opendir('/tmp/xhprof');
if( ! $dir )
die('No directory.');
while(<em>FALSE != ($file = readdir($dir)))
{
if($file[0] === '.')
continue;
$rep = explode('.', $file);
echo "<a href='/xhprof_html/?run=" . $rep[0] . "&source=" . $rep[1] ."'>";
echo $file;
echo "</a><br />";
}
closedir($dir);
Profiling de code:
Pour générer un rapport, il suffit d’encadrer le code à analyser (ici la fonction foo() ) de cette façon:
foo();
$xhprof_data = xhprof_disable();
include_once "/www/xhprof/xhprof_lib/utils/xhprof_lib.php";
include_once "/www/xhprof/xhprof_lib/utils/xhprof_runs.php";
$xhprof_runs = new XHProfRuns_Default();
$run_id = $xhprof_runs->save_run($xhprof_data, "foo");
Les rapports générés seront créés dans /tmp/xhprof et visualisables directement via l’application créée ci-dessus. Pour moi, aller sur http://xhprof.pm/ m’aura permis de visualiser tous les rapports, et sinon l’appel http://xhprof.pm/xhprof_html/index.php?source=foo&run=identifiant pour un run précis (L’identifiant étant la 1ère partie du nom du fichier généré dans /tmp/xhprof).
Dans un futur article, j’en profiterai pour décrire comment on a pu, avec l’aide de xhprof et d’APC, multiplier par 50 les performances de notre application php.