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.

$ wget http://pecl.php.net/get/xhprof-0.9.2.tgz
$ tar xvfz xhprof-0.9.2.tgz
$ cd xhprof-0.9.2/

Compilation & installation de l’extension

$ cd 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):

[xhprof]
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.

$ mkdir /tmp/xhprof ; chmod a+rwt /tmp/xhprof

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:

$ cp -Rp xhprof_html xhprof_lib /www/xhprof/

J’y ai aussi collé un script rapide pour mieux visualiser les reports disponibles (index.php):

<?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:

xhprof_enable( XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY );

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.

Documentation de xhprof.

Leave a reply

required

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>