Comment configurer XHProf et XHGui pour le profilage d’applications PHP sur Ubuntu 14.04

introduction

En génie logiciel, le profilage est une technique utilisée pour analyser les applications au moment de l’exécution, afin d’identifier les goulots d’étranglement et les problèmes de performances possibles au sein d’une application. C’est une ressource essentielle pour l’optimisation des logiciels. Le profilage diffère de l’analyse comparative car il analyse l’application au niveau du code, tandis que l’analyse comparative est destinée à analyser les performances globales de l’application telles qu’elles ont été expérimentées par l’utilisateur final.

A * profiler * est un logiciel qui rassemblera des informations détaillées sur l’application afin de générer des statistiques et des données pertinentes sur l’utilisation de la mémoire, la fréquence et la durée des appels de fonction, le temps nécessaire pour répondre à une demande, entre autres.

XHProf est un profileur conçu pour analyser les applications PHP. Créé et ouvert par Facebook, XHProf fonctionne comme un profileur passif, ce qui signifie qu’il fonctionnera en arrière-plan tout en ayant un impact minimal sur les performances de l’application, ce qui en fait un outil idéal pour les environnements de production.

XHGui offre une interface riche pour la visualisation des données collectées via XHProf.

Ce tutoriel va vous montrer comment installer XHProf et XHGui pour profiler une application PHP fonctionnant sous Ubuntu 14.04.

Conditions préalables

Pour suivre ce guide, vous aurez besoin de:

Lorsque vous êtes prêt à passer à autre chose, connectez-vous à votre serveur en utilisant votre compte sudo.

Étape 1 - Installez les dépendances de serveur

Si vous n’avez pas installé «+ pecl » sur votre serveur, vous devriez le faire installer maintenant. Nous en aurons besoin pour configurer à la fois ` xhprof +` et l’extension PHP + + mongo + `.

Tout d’abord, mettez à jour le cache du gestionnaire de paquets avec:

sudo apt-get update

Ensuite, nous installerons + pecl + avec le paquetage + php-pear +. Nous aurons également besoin de + php5-dev + pour installer les modules PHP via + pecl +, et + php5-mcrypt + pour configurer XHGui:

sudo apt-get install php-pear php5-dev php5-mcrypt

Pour activer l’extension + mcrypt +, exécutez:

sudo php5enmod mcrypt

Enfin, nous aurons besoin de Git pour installer XHGui. Si Git n’est pas déjà installé sur votre serveur, vous pouvez l’installer maintenant avec:

sudo apt-get install git

Étape 2 - Installer XHProf

Nous devrions maintenant installer et activer XHProf. Pour l’installer via + pecl +, lancez:

sudo pecl install xhprof-beta

Ensuite, nous devons activer l’extension + xhprof +. Pour faciliter ce processus tout en conservant les standards Ubuntu / Debian, nous allons créer un fichier de configuration + ini + séparé et l’activer à l’aide de la commande + php5enmod +.

Créez un nouveau fichier de configuration + ini + dans + / etc / php5 / mods-available +:

sudo nano /etc/php5/mods-available/xhprof.ini

Incluez le contenu suivant dans ce fichier:

/etc/php5/mods-available/xhprof.ini

extension=xhprof.so

Pour activer le fichier de configuration du module, exécutez:

sudo php5enmod xhprof

Il ne reste maintenant qu’à redémarrer le serveur Web pour appliquer les modifications. Sur les environnements * LAMP * (Apache), vous pouvez le faire avec:

sudo service apache2 restart

Sur les environnements * LEMP * (Nginx + PHP5-FPM), vous devez redémarrer le service + php5-fpm + avec:

sudo service php5-fpm restart

L’extension + xhprof + devrait maintenant être installée et activée. Pour confirmer, vous pouvez exécuter:

php --ri xhprof

Le résultat devrait ressembler à ceci:

Outputxhprof

xhprof => 0.9.2
CPU num => 1

Étape 3 - Installez MongoDB

La prochaine étape consiste à installer MongoDB et l’extension PHP + mongo + sur le serveur. MongoDB est utilisé par XHGui pour stocker les données obtenues via l’analyse d’applications de XHProf.

Pour installer MongoDB, exécutez:

sudo apt-get install mongodb

Pour installer l’extension PHP MongoDB, exécutez:

sudo pecl install mongo

L’installation vous demandera à un moment ou à un autre de choisir si vous souhaitez activer l’authentification d’entreprise pour MongoDB. Vous pouvez laisser la valeur par défaut (non) et appuyer simplement sur Entrée pour continuer l’installation.

Nous devons maintenant activer l’extension PHP + mongo +, en suivant la même procédure que celle utilisée pour l’extension + xhprof +. Créez un nouveau fichier de configuration dans + / etc / php5 / mods-available / mongo.ini +:

sudo nano /etc/php5/mods-available/mongo.ini

Inclure le contenu suivant dans le fichier:

/etc/php5/mods-available/mongo.ini

extension=mongo.so

Pour activer le fichier de configuration du module, exécutez:

sudo php5enmod mongo

Maintenant, redémarrez le serveur Web pour appliquer les modifications. Sur les environnements * LAMP * (Apache), vous pouvez le faire avec:

sudo service apache2 restart

Sur les environnements * LEMP * (Nginx + PHP5-FPM), vous devez redémarrer le service + php5-fpm + avec:

sudo service php5-fpm restart

L’extension + mongo + devrait maintenant être installée et activée. Pour confirmer, vous pouvez exécuter:

php --ri mongo

Le résultat devrait ressembler à ceci:

Outputmongo

MongoDB Support => enabled
Version => 1.6.12
Streams Support => enabled
SSL Support => enabled
                  Supported Authentication Mechanisms
MONGODB-CR => enabled
SCRAM-SHA-1 => enabled
MONGODB-X509 => enabled
GSSAPI (Kerberos) => disabled
PLAIN => disabled
...

Étape 4 - Configuration des index MongoDB (facultatif)

Il s’agit d’une étape facultative mais recommandée qui améliorera les performances globales de XHGui lors du stockage et de l’accès aux données à partir de MongoDB.

Accédez au client MongoDB via la ligne de commande avec:

mongo

Maintenant, exécutez la séquence de commandes suivante afin de créer les index pour XHGui:

use xhprof
db.results.ensureIndex( { 'meta.SERVER.REQUEST_TIME' : -1 } )
db.results.ensureIndex( { 'profile.main().wt' : -1 } )
db.results.ensureIndex( { 'profile.main().mu' : -1 } )
db.results.ensureIndex( { 'profile.main().cpu' : -1 } )
db.results.ensureIndex( { 'meta.url' : 1 } )

Pour quitter le client MongoDB, exécutez:

exit

Étape 5 - Installer XHGui

L’étape suivante consiste à installer XHGui et à le configurer en tant qu’hôte virtuel sur votre serveur Web.

Nous allons commencer par cloner le référentiel XHGui à partir de Github. Parce que nous devons servir le contenu de XHGui en tant qu’hôte virtuel sur le serveur Web, nous allons placer le référentiel cloné dans + / var / www +.

Il est recommandé de configurer le répertoire XHGui comme appartenant à votre utilisateur habituel. Dans cet exemple, nous allons utiliser + sammy + comme nom d’utilisateur et groupe, mais vous devez remplacer ces valeurs par vos propres nom d’utilisateur et groupe.

sudo mkdir -p /var/www/xhgui
sudo chown -R . /var/www/xhgui
cd /var/www
git clone https://github.com/perftools/xhgui.git xhgui

Pour installer les dépendances de XHGui, exécutez le programme d’installation inclus:

cd xhgui
php install.php

Une fois les dépendances installées avec succès, nous devons configurer un hôte virtuel pour servir le contenu de + xhgui +. Les sections suivantes expliquent comment créer un hôte virtuel pour + xhgui + dans les environnements LAMP et LEMP.

Configuration de l’hôte virtuel de XHGui sur LAMP

Lorsque nous utilisons Apache en tant que serveur Web, nous devons d’abord nous assurer que + mod_rewrite + est activé. Pour l’activer, lancez:

sudo a2enmod rewrite

Créez un nouveau fichier hôte virtuel sous + / etc / apache2 / sites-available:

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

Placez le contenu suivant dans ce fichier:

/etc/apache2/sites-available/xhgui.conf

<VirtualHost *:80>
   DocumentRoot /var/www/xhgui/webroot
   ServerName

   <Directory "/var/www/xhgui/webroot">
       Options Indexes MultiViews FollowSymLinks
       AllowOverride All
       Require all granted
   </Directory>
</VirtualHost>

Notez que la racine du document doit pointer vers le sous-répertoire + webroot + dans le répertoire principal de XHGui.

Activer l’hôte virtuel avec:

sudo a2ensite xhgui

Pour appliquer les modifications, rechargez Apache avec:

sudo service apache2 reload

Configuration de l’hôte virtuel de XHGui sur LEMP

Commencez par créer un nouveau fichier d’hôte virtuel sur + / etc / nginx / sites-available +:

sudo nano /etc/nginx/sites-available/xhgui

Placez le contenu suivant dans ce fichier:

/ etc / nginx / sites-available / xhgui

server {
   listen   80;
   server_name ;
   root   /var/www/xhgui/webroot/;
   index  index.php;

   location / {
       try_files $uri $uri/ /index.php?$uri&$args;
   }

   location ~ \.php$ {
               try_files $uri =404;
               fastcgi_split_path_info ^(.+\.php)(/.+)$;
               fastcgi_pass unix:/var/run/php5-fpm.sock;
               fastcgi_index index.php;
               include fastcgi_params;
   }
}

Notez que la racine du document doit pointer vers le sous-répertoire + webroot + dans le répertoire principal de XHGui.

Pour activer le nouvel hôte virtuel, exécutez:

sudo ln -s /etc/nginx/sites-available/xhgui /etc/nginx/sites-enabled/xhgui

Maintenant, redémarrez Nginx pour appliquer les modifications:

sudo service nginx restart

Étape 6 - Configurer XHProf

À ce stade, vous devriez pouvoir accéder à l’interface de XHGui à partir de votre navigateur en consultant le nom du serveur que vous avez spécifié dans la configuration de votre serveur Web. Comme nous n’avons pas encore commencé à collecter des données de profilage, vous devriez voir une page comme celle-ci:

image: http: //assets.digitalocean.com/articles/xhprof-ubuntu/01-empty.png [Image 01: Première exécution de XHGui]

L’extension XHProf est déjà installée sur le serveur, mais nous devons encore activer le processus de profilage pour votre application. Cela se fait généralement en incluant une directive PHP sur votre serveur Web qui ajoute automatiquement un morceau de code à tous les scripts PHP en cours d’exécution. Il est important de noter que, par défaut, XHProf ne profilera qu’une demande sur 100 adressée à l’application.

XHGui fournit un en-tête PHP par défaut que vous pouvez ajouter à vos scripts afin d’initialiser le profilage de votre application. Si vous avez suivi toutes les étapes de ce tutoriel, le fichier d’en-tête doit être situé à + ​​/ var / www / xhgui / external / header.php +.

Les sections suivantes vous montreront comment ajouter automatiquement ce fichier d’en-tête à tous vos scripts PHP dans les environnements Apache et Nginx. Pour cet exemple, nous allons activer le profilage pour une application WordPress hébergée en tant que site Web principal sur ce serveur.

Activation du profilage sur Apache

Modifions le fichier de configuration Apache du site Web que nous souhaitons profiler. Dans cet exemple, nous allons activer le profilage pour le site Web principal Apache hébergé sur ce serveur, défini dans + / etc / apache2 / sites-available / 000-default.conf +. Ouvrez ce fichier avec l’éditeur de ligne de commande de votre choix:

sudo nano /etc/apache2/sites-available/000-default.conf

Incluez la ligne en surbrillance dans le bloc + <VirtualHost> + existant:

/etc/apache2/sites-available/000-default.conf

<VirtualHost *:80>
 ...

 ...
</VirtualHost>

Enregistrez le fichier et quittez. Redémarrez Apache pour appliquer les modifications:

sudo service apache2 restart

Activation du profilage sur Nginx

Modifions le fichier de configuration Nginx du site Web que nous souhaitons profiler. Dans cet exemple, nous allons activer le profilage pour le site Web + default + hébergé sur ce serveur, défini dans + / etc / nginx / sites-available / default +. Ouvrez ce fichier avec l’éditeur de ligne de commande de votre choix:

sudo nano /etc/nginx/sites-available/default

Recherchez maintenant le bloc qui définit comment les scripts + .php + sont gérés. Inclure la ligne en surbrillance à l’intérieur de ce bloc:

/ etc / nginx / sites-available / default

location ~ \.php$ {
  ...

  ...
}

Enregistrez le fichier et quittez. Redémarrez Nginx pour appliquer les modifications:

sudo service nginx restart

Étape 7 - Démarrer avec XHGui

Tout est maintenant correctement configuré, mais en fonction du nombre de visites sur votre site Web, il peut s’écouler un certain temps avant que les premières données de profilage apparaissent dans XHGui. Cela est dû au fait que par défaut, XHProf profilera seulement 1 demande sur 100 reçue. Vous devrez peut-être naviguer sur votre site Web et le recharger plusieurs fois avant que des données de profil ne soient disponibles.

XHGui Vue d’ensemble

Lorsque les informations de profilage sont disponibles, vous devriez voir une page comme celle-ci:

image: http: //assets.digitalocean.com/articles/xhprof-ubuntu/02-overview.png [Image 02: Vue d’ensemble de XHGui]

Vous trouverez ci-dessous une description rapide de chaque champ de ce tableau:

  • * Method: * La méthode utilisée dans la requête analysée

  • * URL: * L’URL qui a été profilée

  • * Heure: * Heure à laquelle ces données de profilage ont été collectées

  • * wt (Wall Time): * Combien de temps cette demande a pris pour être complétée

  • * cpu: * Le temps passé par la CPU à exécuter cette requête

  • * mu (utilisation de la mémoire): * mémoire moyenne utilisée lors de cette requête

  • * pmu (utilisation maximale de la mémoire): * utilisation maximale de la mémoire lors de cette demande

Pour voir les détails d’une exécution de profilage, utilisez le lien dans le champ time. Vous devriez voir une page comme celle-ci:

image: http: //assets.digitalocean.com/articles/xhprof-ubuntu/03-profile.png [Image 03: Données de profilage]

Sur le côté gauche, vous pouvez voir des informations sur la demande analysée, telles que la méthode utilisée, le nom du script et l’URL, les paramètres de la demande, entre autres. Dans le contenu de la page principale, vous pouvez identifier les fonctions ou méthodes dont l’exécution a pris le plus de temps, ainsi que les fonctions ou méthodes générant une consommation de mémoire supérieure. Toutes ces informations sont liées à une exécution et à une demande de profilage spécifiques.

Inspection des appels de fonction

Si vous faites défiler l’écran jusqu’en bas de la page, vous aurez accès à une table contenant des informations détaillées sur tous les appels de fonction exécutés au cours de cette demande, notamment le nombre d’exécutions de la fonction ou de la méthode, son temps d’exécution, son importance. mémoire utilisée et de nombreux autres détails intéressants. Vous pouvez utiliser l’en-tête de la table pour classer la liste en fonction de l’un de ces paramètres. Vous pouvez également utiliser le champ de recherche situé à droite pour rechercher une fonction ou un nom de méthode spécifique.

image: http: //assets.digitalocean.com/articles/xhprof-ubuntu/04-functioncalls.png [Image 04: Appels de fonctions XHGui]

Comparer les courses

L’une des fonctionnalités les plus utiles de XHGui est l’outil de comparaison que vous pouvez utiliser pour comparer deux exécutions de profilage différentes. Cela vous permet d’apporter des modifications à votre code et de comparer plusieurs exécutions pour voir si vos modifications ont entraîné des gains de performances pour l’application.

Lorsque vous regardez un ensemble de données de profil, vous pouvez voir à la droite de la section Watch Functions un bouton nommé * Compare This Run *. En cliquant sur ce bouton, vous obtenez une liste de toutes les exécutions de profilage exécutées pour cette URL spécifique, où vous pouvez choisir l’un des éléments de la liste pour générer une vue de comparaison. Il suffit de choisir le cycle auquel vous souhaitez comparer et cliquez sur le bouton Compare.

Voici à quoi ressemble la vue de comparaison:

image: http: //assets.digitalocean.com/articles/xhprof-ubuntu/05-compare.png [Image 05: Comparaison des cycles XHGui]

Conclusion

Le profilage est une technique importante pour l’optimisation logicielle. Il vous donne des informations détaillées sur votre application au niveau du code. À l’aide d’outils tels que XHProf et XHGui, vous pouvez identifier efficacement les parties problématiques de votre code et surveiller l’impact des modifications de code sur les performances de l’application.

Pour plus d’informations sur les options de configuration disponibles pour XHGui, consultez le référentiel officiel Github.