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.
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.
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
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 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 valeurinc
de 100%, mais généralement de 0% pourexc
, puisqu’il ne se passe rien dans ce fichier même.
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
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.