magentix

Développeur backend indépendant Web, e-commerce, Open-Source, low-tech, indie-web, slow-web, SSG, accessibility, PHP, Python

Billets : Contrôler la performance du code PHP avec l'outil de profiling XHProf


Contrôler la performance du code PHP avec l'outil de profiling XHProf

Par Matthieu le 17/10/2019

XHProf est une extension PHP qui ne sert qu'à faire du profiling. Elle a été créée par Facebook puis donnée à la communauté OpenSource en 2009. Bien qu'aujourd'hui l'extension ne soit plus maintenue par Facebook, des forks assurent les évolutions (compatibilité avec les dernières versions de PHP).


Pour le profiling rapide d'un projet, XHProf est une excellente extension. Elle permet en quelques secondes de détecter les fuites de mémoire, avec un impact sur les temps d'exécution de l'application extrêmement faible.

Cet article explique comment implémenter XHProf pour votre application PHP.

Xhprof Callgraph

Installer l'extension PHP

Nous installons l'extension pour PHP 7 maintenue par Tideways.

git clone "https://github.com/tideways/php-xhprof-extension.git"
cd php-xhprof-extension
phpize
./configure
make
sudo make install

On active ensuite l'extension, à adapter selon la version de PHP en place (ici php 7.2).

echo "extension=tideways_xhprof.so" | sudo tee -a /etc/php/7.2/mods-available/xhprof.ini

PHP standard :

sudo phpenmod -v 7.2 xhprof
sudo service apache2 restart

PHP FPM :

sudo phpenmod -v 7.2 -s fpm xhprof
sudo service php7.2-fpm restart
sudo service apache2 restart

Installer une interface web

Le rapport fournit par XHProf doit être analysé via une interface web. Cette interface permet la navigation dans l'arbre et la génération de graphs.

sudo mkdir /var/www/xhprof
cd /var/www/hxprof
git clone https://github.com/sters/xhprof-html .
sudo nano /etc/hosts

On ajoute au fichier une nouvelle entrée :

127.0.0.1 localhost.xhprof

On génère ensuite un nouveau vhost :

sudo nano /etc/apache2/sites-available/xhprof.conf

On utilise la configuration basique suivante :

<VirtualHost *:80>
    ServerAdmin webmaster@localhost

    DocumentRoot /var/www/xhprof
    ServerName localhost.xhprof

    <Directory /var/www/xhprof>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
    </Directory>
</VirtualHost>

Il ne reste plus qu'à activer le site :

sudo a2ensite xhprof.conf
sudo service apache2 restart

Depuis le navigateur, accédez à l'URL http://localhost.xhprof/?dir=/tmp. Le paramètre dir dans l'URL indique que les runs sont stockés dans le dossier /tmp de la machine (à adapter si besoin). Vous obtenez le message suivant :

No XHProf runs specified in the URL.
Existing runs:

Installation de GraphViz

GraphViz est la solution retenue pour la génération des graphiques (callgraphs). C'est un ensemble d'outils OpenSource dédiés à la génération de graphs. Ils seront générés via l'interface Web.

sudo apt-get install graphviz

Profiler une application PHP

Pour exécuter un run XHProf, il faut simplement ajouter dans le code de l'application les lignes suivantes :

tideways_xhprof_enable();

// Code à profiler

$data = tideways_xhprof_disable();
$namespace = 'myapp';
file_put_contents(
    sys_get_temp_dir() . "/" . uniqid() . "." . $namespace . ".xhprof", // /tmp/xxxxxxxxxxxxx.myapp.xhprof
    serialize($data)
);

Pour profiler entièrement l'application, on place généralement ces lignes dans le fichier index.php.

Le fichier généré dans tmp est de la forme xxxxxxxxxxxxx.myapp.xhprof. Ce fichier contient l'ensemble des données enregistrées par XHProf. Il peut maintenant être analysé via l'interface Web.

Analyse des résultats

En ouvrant de nouveau http://localhost.xhprof/?dir=/tmp, vous disposez maintenant du run :

Xhprof Runs

Sélectionnez le run correspondant, l'analyse peut alors débuter...

Une question ? Rejoignez-moi sur le Fédivers :
@magentix@magentix.space