Améliorer son code PHP Exercice de profiling avec Xhprof

Nous allons reprendre l'exemple de code utilisé avec Xdebug (accès et traitement minimaliste à une base de données).

Le profileur de Xhprof se déclenche au moyen de fonctions PHP que l'extension a ajoutées. xhprof_enable() active le profiling ; cette fonction prend comme paramètres des bits représentés sous forme de constantes qui indiquent quoi profiler dans le script.

Nous vous conseillons pour démarrer XHPROF_FLAGS_CPU et XHPROF_FLAGS_MEMORY.


ALLER PLUS LOIN Drapeaux Xhprof

La documentation officielle de Xhprof vous en apprendra plus au sujet des drapeaux (il n'en existe que trois au total) :
http://mirror.facebook.net/facebook/xhprof/doc.html#production_notes



 Déclenchement du profiling Xhprof sur un script


<?php

xhprof_enable(XHPROF_FLAGS_CPU | XHPROF_FLAGS_MEMORY);

// le profiling est activé, écrivez ici votre script ?

$xhprof_data = xhprof_disable();

// var_dump($xhprof_data); donnera les informations du profil

Le profil ressort dans /tmp, comme nous l'avions défini en configuration. Cependant, il n'est pas visible de manière directe. Si vous voulez immédiatement des informations à son sujet, affichez à l'écran le retour de xhprof_disable(), par exemple avec un var_dump(). Vous obtenez alors un gros tableau PHP, mais les informations qu'il contient ne sont pas très lisibles ni exploitables. Pour y remédier, utilisez le paquet de l'extension Xhprof : il possède tous les outils pour lire et exploiter ces traces (à partir du fichier de dump), et notamment en sortir une représentation graphique.

Pour nous simplifier la tâche, créons des liens symboliques vers ces outils dans notre DocumentRoot (/var/www) et nous utiliserons les directives d'inclusion automatique de scripts de PHP pour éviter d'avoir à dupliquer les lignes activant le profiling dans toutes les pages.


 Créons des liens symboliques vers le DocumentRoot

phptuning:~# mkdir /var/www/xhprof
phptuning:~# ln -s /usr/local/lib/php/xhprof/xhprof_html /var/www/xhprof
phptuning:~# ln -s /usr/local/lib/php/xhprof/xhprof_lib /var/www/xhprof



 Script en auto_prepend_file dans php.ini

<?php
if (extension_loaded('xhprof')) {
include_once '/usr/local/lib/php/xhprof_lib/utils/xhprof_lib.php';
include_once '/usr/local/lib/php/xhprof_lib/utils/xhprof_runs.php';
xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
}


Script en auto_append_file dans php.ini

if (extension_loaded('xhprof')) {
$profileName = 'profil'; // nom de l'application
$xhprof_data = xhprof_disable();
$xhprof_runs = new XHProfRuns_Default(); // Classe issue de /xhprof_lib
$run_id = $xhprof_runs->save_run($xhprof_data, $profileName);

// url vers les bibliothèques graphiques, /xhprof_html
printf('<a href="http://127.0.0.1/xhprof/xhprof_html/
=> index.php?run=%s&source=%s'" target="_blank">Profil</a>, $run_id, $profileName);
}


Ici, tout script lancé sera encadré par des scripts prepend/append qui démarrent et sauvent le profil. Vous pouvez personnaliser ces scripts auto-inclus pour qu'ils déclenchent le profiling uniquement si un cookie est détecté dans la requête. Un profil est l'association d'un nom (fixé par nos soins) et d'un identifiant (aléatoire, changeant à chaque profil).

En relançant notre page et en cliquant sur le lien Profile apparu en bas, les outils UI de Xhprof présentent le résultat de profiling sous forme de tableau statistique.

On obtient des mesures semblables à celles de Xdebug et qui suivent les mêmes principes. Les mesures CPU et mémoire sont agréables car elles renseignent encore plus par rapport au simple temps d'exécution de la fonction (ces mesures concernent les consommations en mode utilisateur et en mode kernel).

Enfin, un lien View full graph affiche un graphique semblable à celui de Xdebug dans KcacheGrind (figure 8.4). Attention, le tracé de graphique utilise graphviz. Veillez à ce que ce paquet soit installé, sinon aucun graphique n'apparaîtra.


figure 8-4 tracé graphique du profiling via xhprof
Figure 8-4 Tracé graphique du profiling via XHProf © Eyrolles