Profiling d’applications PHP

Voyons comment optimiser un site PHP avec un profiler. Par un exemple concret avec les logiciels open source XDebug et Kcachegrind.

XDebug

XDebug est un outil de débogage d’application, mais qui possède également une fonctionnalité moins connue : le profiling. Il s’agit de fournir des statistiques concernant :

  • Le nombre de fois qu’une méthode a été appelée et par qui.
  • Les performances des méthodes (combien de temps elles mettent à s’exécuter).

Tout ceci peut être présenté sous la forme de tableaux et de graphes de type « arbre d’appel ». En gros, XDebug alimente un fichier (attention au fait que le fichier de sortie du mode profiling peut être volumineux) et c’est un autre programme qui présentera les résultats (dans cet article Kcachegrind). Comme expliqué plus loin, il y a une astuce pour réduire la taille du fichier de sortie par la configuration d’un trigger.

Installation de XDebug

Pour trouver facilement, la version adéquate de xdebug, on pourra utiliser cet utilitaire en ligne. Il suffit d’y copier la sortie de la commande php -i pour qu’il vous suggère la bonne version à télécharger et à installer.

Configuration de XDebug

Dans le fichier PHP.ini ajoutez les lignes de configuration correspondantes à votre installation, par exemple :

zend_extension = C:\Program Files\EasyPHP-5.3.3\php\php_xdebug-2.1.0-5.3-vc6.dll
xdebug.profiler_enable = 1
xdebug.profiler_output_dir = C:\Program Files\EasyPHP-5.3.3\php\profiling

  • zend_extension est le chemin d’installation de xdebug
  • xdebug.profiler_enable active ou désactive le profiling systématique.
  • xdebug.profiler_output_dir contient le répertoire dans lequel sera stocké le fichier de sortie du mode profiling.

Dans le cas où vous ne souhaitez pas faire du profiling sur toutes les requêtes PHP, on peut mettre en place un trigger pour activer ponctuellement le profiling. Dans ce cas, désactivez le profiling et paramétrez le déclenchement du profiling par trigger :

xdebug.profiler_enable_trigger = 1
xdebug.profiler_enable = 0

Pour activer le profiling sur certaines requêtes, on ajoutera – par exemple (peut se faire par cookie ou par POST) – un paramètre XDEBUG_PROFILE=1 à l’URL invoquée (activation par GET).
http://127.0.0.1/check.php?XDEBUG_PROFILE=1 au lieu de http://127.0.0.1/check.php

Ainsi, pour utiliser le profiling dans des tests de charge sans surcharger le serveur ou dépasser les capacités du disque dur, on pourrait choisir de ne faire du profiling que sur 5% à 10% des utilisateurs simulés en implémentant un mécanisme qui n’ajoute ce paramètre que dans certains cas. En le gérant dans le script avec les paramètres ou en créant un script dédié et lancé avec 5 à 10 % des utilisateurs, voire avec un seul.

Kcachegrind

Kcachegrind est un outil qui présentera les résultats produits par XDebug. Pour la petite histoire, Le fichier de sortie du débogeur respecte un format (inventé avec le logiciel Valgrind).

Installation de Kcachegrind

Sous Windows, je recommande le package précompilé qui contient tout ce qu’il faut en termes de bibliothèques et Runtimes (QT, Pango, GraphViz, …). Il n’est pas nécessaire de l’installer par un setup, il suffit de le décompresser dans un répertoire et de lancer kcachegrind.exe.

Utilisation de Kcachegrind

Dans Kcachegrind il suffit d’ouvrir le fichier de sortie généré par XDebug qui en fait une analyse statique. Kcachegrind offre les fonctions classiques d’un profiler :

  • Fonctions les plus coûteuses.
KCacheGrind_Top_Methods

Fonctions PHP les plus coûteuses

  • Fonctions les plus invoquées.
  • Arbre des appels.

 

KCacheGrind_CallGraph

Arbre des appels des fonctions PHP

  • Coût par ligne de code (si le chemin est accessible localement par copie des sources).

 

KCacheGrind_Cout_par_ligne

Coût par ligne de code

  • Couverture des fonctions (i.e. quelles sont les fonctions qui appellent une fonction donnée).
  • et bien d’autres fonctions…

Pour aller plus loin

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *