Aller au contenu principal

Explorer une application php avec php-spx

Flame Graph pour Php

Nous avons vu précédemment comment générer des graphes de flammes pour analyser son système GNU/Linux. Dans cet article nous allons voir comment générer ce type de graphe pour une application php.

Grâce à l’extension php-spx ce n’est pas simplement une image svg qui va nous fournir des indications sur les fonctions les plus gourmandes de notre programme php, mais c’est une application web dédiée, beaucoup plus riche en terme d’information qui sera à notre disposition.

Comment installer php-spx

Je ne vais détailler ce qui est déjà écrit dans la documentation du projet. Je vais simplement expliquer les modifications que j’effectue sur mon container docker php-fpm, lancé par docker-compose, qui contient aussi un serveur web et une base de donnée (ces autres containers ne seront pas décrit ici).

Par défaut mon Dockerfile copie déjà des fichiers de configuration ou bien des fichiers à exécuter dans le container. J’ajoute donc deux fichiers supplémentaires pour l’extension php-spx:

diff --git a/docker/php/Dockerfile b/docker/php/Dockerfile
 
 COPY ./xdebug.sh /tmp/xdebug.sh
+COPY ./spx.sh /tmp/spx.sh
+COPY ./spx.ini /tmp/spx.ini
 
 USER ${CONTAINER_UID}:${CONTAINER_GID}
 COPY --chown=${CONTAINER_UID}:${CONTAINER_GID} ./install.sh /tmp/install.sh
 

install.sh est le fichier qui est exécuté par le container avec CMD ["/bin/bash","/tmp/install.sh"], et bien évidement la dernière ligne de ce fichier est php-fpm

diff --git a/docker/php/install.sh b/docker/php/install.sh
 
     sudo bash /tmp/xdebug.sh
+    sudo bash /tmp/spx.sh
 
     if [ -f "source/index.php.installing.tmp" ]
     then

Voici maintenant le contenu des deux nouveaux fichiers. Tout d’abord la configuration de l’extension:

diff --git a/docker/php/spx.ini b/docker/php/spx.ini
new file mode 100644
+extension=spx.so
+spx.http_enabled=1
+spx.http_key="dev"
+spx.http_ip_whitelist="127.0.0.1,{EXTERNAL_IP}"

Et ensuite le fichier qui va installer l’extension dans le container:

diff --git a/docker/php/spx.sh b/docker/php/spx.sh
new file mode 100644
+cd /tmp
+apt-get update && apt-get install zlib1g-dev
+git clone https://github.com/NoiseByNorthwest/php-spx.git
+cd php-spx
+phpize
+./configure
+make
+make install
+cp /tmp/spx.ini /usr/local/etc/php/conf.d/spx.ini
+EXTERNAL_IP=$(/sbin/ip route|awk '/default/ { print $3 }')
+sed -i "s/{EXTERNAL_IP}/${EXTERNAL_IP}/" /usr/local/etc/php/conf.d/spx.ini

Et comment ça marche

Maintenant, en allant sur l’url de l’application et en y ajoutant le suffixe, /?SPX_UI_URI=/ vous devriez accéder à l’interface de gestion de php-spx.

Checkbox qui permet d’activer l’enregistrement d’une session. Cliquer pour voir l’image en taille plus grande

Figure 1 : Checkbox qui permet d’activer l’enregistrement d’une session

Nous allons activer l’enregistrement des évènements en cliquant sur la checkbox. Ensuite nous pouvons aller visiter une ou plusieurs pages de notre application avant de revenir à cette page.

Nous avons maintenant dans le bas de la page la liste des urls que nous avons visitées et en cliquant sur un des liens, nous pouvons enfin analyser l’exécution du code de notre application.

Écran principal de l’extension php-spx  lors d’une analyse de session. Cliquer pour voir l’image en taille plus grande

Figure 2 : Écran principal de l’extension php-spx lors d’une analyse de session

La ligne de temps, en haut de la page, montre chaque fonction appelée. La vue globale est au dessus et la vue détaillée juste en dessous. Plus la fonction prend du temps à s’exécuter, plus elle apparaît large. Lorsque la la barre représentant une fonction est cliquée (depuis la vue détaillée ou globale), s’affiche le détail de la fonction:

  • son nom
  • la profondeur
  • le temps d’exécution

Vue sur la ligne de temps et la zone détaillée. Cliquer pour voir l’image en taille plus grande

Figure 3 : Vue sur la ligne de temps et la zone détaillée

En bas à droite s’affiche un résumé du graphe de flammes: toutes les stacks (chaînes de fonctions qui s’appellent) identiques sont regroupés ensemble. Pour information, cet affichage qui regroupe les stacks identiques est le type d’affichage par défaut présenté précédemment.

Le graphe de flammes d’une application php. Cliquer pour voir l’image en taille plus grande

Figure 4 : Le graphe de flammes d’une application php

Le tableau à gauche montre toutes les fonctions. Il est possible de trier le tableau par chaque colonne. Les informations les plus importantes sont les colonnes Inc et Exc:

  • Inc: est le temps passé au total dans la fonction
  • Exc: est le temps passé dans la fonction elle même, soit le temps total, moins le temps passé dans les autres fonctions appelées
  • exemple: index.php a une valeur inc de 100%, mais généralement de 0% pour exc, puisqu’il ne se passe rien dans ce fichier même.

Tableau des fonctions. Cliquer pour voir l’image en taille plus grande

Figure 5 : Tableau des fonctions

La vue globale est extrêmement pratique, parce qu’elle permet de zoomer à sur une période de temps très très précise. Toutes les informations de la page se mettent à jour pour correspondre à ce qui se passe pendant l’intervalle de temps zoomé: vue détaillée, tableau et graphe de flammes.

Et en ligne de commande

Et bien c’est simple comme:

SPX_ENABLED=1 SPX_FP_LIVE=1 vendor/bin/oxid cache:clear

Affichage du profile d’une commande php lancée dans un terminal. Cliquer pour voir l’image en taille plus grande

Figure 6 : Affichage du profile d’une commande php lancée dans un terminal

Pour finir

Php-spx est une extension incroyable et très pratique, pour analyser la performance d’une page php, mais aussi pour apprendre le fonctionnement des frameworks php en examinant en live ce qu’ils font.

La seule limite est qu’elle ne fournit pas les arguments des fonctions, ce qui peut-être une limite parfois, comme par exemple pour trouver les requêtes SQL les plus lentes.