RootsLabs

More than a tool ! GitHub Google+ LinkedIn RSS

Blackfire ou comment profiler votre application PHP ?

Progi1984 - Commentaires (0)

Blackfire est un outil fourni par SensioLabs afin de profiler du code PHP, et ainsi trouver les goulots d’engorgement du code, les endroits où l’on pourrait mettre du cache, etc…
Dans cet article, nous allons voir comment l’installer via Docker, l’utiliser et un cas d’utilisation avec PHPPresentation.

Blackfire : Logo

Pré-requis

Sur la page Credentials de Blackfire, quatre clés seront disponibles :

  • Client ID ;
  • Client Token ;
  • Server ID ;
  • Server Token.

Installation de Blackfire avec Docker

Pour le fichier docker-compose.yml, j’ai modifié le container php, je lui ai ajouté les variables d’environnement utiles pour Blackfire.

J’ai aussi modifié le fichier Dockerfile, qui va générer le container php, en lui ajoutant les ligne en surligné pour Blackfire :

Après ces modifications, vous devez regénérer le container php :

Et lancer tous les containers :

Utilisation de Blackfire sur un fichier

Malgré une ligne de commande assez complexe, l’utilisation reste assez simple.

Il faut tout d’abord récupérer l’ID du container PHP via un docker ps.

Après cela, on lance la commande pour analyser un fichier PHP en ligne de commande :

Pour cela, on a besoin de l’ID du container, des clés récupérés dans les pré-requis et le chemin du fichier à exécuter.

Cas d’utilisation : PHPPresentation

Pour tester Blackfire, je voulais un véritable cas d’exemple et j’ai pensé à un de mes projets open source : PHPPresentation.

Je suis parti d’un exemple (Sample_01_Complex.php) que j’ai profilé. Un point m’a choqué : la méthode writeAttribute faisait un nombre important d’appels à une méthode magique.
Blackfire : Avant l'optimisation

En poussant un peu plus loin, je me suis aperçu que la classe XMLWriter de PhpOffice\Common stockait dans un attribut une instance de XMLWriter et faisait des appels via la méthode magique __call. J’ai modifié le code pour que XMLWriter hérite directement de la classe native XMLWriter.

Lien du commit : https://github.com/PHPOffice/Common/commit/cfeb9d71c09e38441d5ec06f21855733d0c71077

Et voilà, comment optimiser son code pour éviter des appels inutiles : cela a permis de gagner 29ms au niveau de la méthode writeSlide().
L’image ci-dessous est un comparatif entre le profilage avant la modification et le profilage après la modification. On y voit rapidement les gains en temps processeur au niveau des méthodes.

Blackfire : Gain avant / après

Conclusion

Blackfire est un outil qui va permettre d’optimiser certains processus.
A mon niveau, ses avantages sont :

A mon niveau, ses inconvénients sont :

  • le plan Hack qui ne permet pas de garder plus d’une journée son profilage ;
  • aucun plan pour des projets Open Source ;
  • la possibilité de ne pas définir via le Dockerfile le CLIENT_ID et le CLIENT_SECRET afin de faciliter la ligne de commande.

Je dirais que Blackfire est un bon outil à mettre dans les mails des entreprises mais pour les fans d’open source qui souhaiteraient faire du profilage, il faut regarder les solutions alternatives : XHProf ou XDebug.

Merci à Christophe Dujarric pour les logos.

Ajouter un commentaire

Commentaire :