Vous avez monté une application web que vous utilisez régulièrement, et vous souhaitez rechercher un moyen de l'optimiser, ou vous avez besoin d'un outil de profiling dans le cadre de votre développement PHP ? Vous êtes sur mac osX, vous utilisez MAMP (1.3.1). Moi aussi !!
Je me suis donc décidé à voir ce que donne xdebug qui semble être l'outil incontournable pour accomplir cette tâche. J'ai rencontré quelques obstacles pour arriver à mes fins, qui justifient je pense l'écriture de ce billet.
Installer xdebug
Il n'existe pas de version précompilée de Xdebug pour mac, qui plus est la compilation dépend de la version du moteur Zend utilisé dans votre environnement. Donc, une compilation est nécessaire. Le problème avec MAMP, c'est que les librairies C en sont absentes, ce qui rend toute compilation de module PHP impossible.
Il faut donc, dans un premier temps, récupérer une distribution de php avec le même moteur Zend que la version de MAMP incluant les librairies (à savoir 20050922). Tout ça uniquement pour compiler le module...
Le package d'entropy étant passé en php 5.2, je me suis rabattu sur une autre solution (plus simple, voir note de bas de page)
Pour ce faire j'ai opté pour le package php de Marc Liyanage (ceux qui sont sur osX depuis le début doivent connaitre car il a été le premier à proposer des packages d'installation apache/php/mysql pour osX, qui soient à la portée d'un développeur web de base comme moi).
Le package php 5.1.6 se trouve ici. Récupérez-le, installez-le (c'est un .pkg). Toute l'installation est placée dans le dossier /usr/local/php5/. La version PHP de MAMP est 5.1.4, mais le moteur Zend est le même,c'est ce qui compte.
Cette fois on a les librairies C (dans le dossier include).
Allons nous placer dans une fenêtre terminal.
A savoir, le module php de marc liyanage a effectué une installation des binaires en root/wheel. Alors ceux de MAMP vous appartiennent. Il va donc falloir compiler le module en tant que root.
Pour ce faire, et comme je suis un partisan du moindre effort (il faut déjà en faire assez) nous allons utiliser le gestionnaire de packages PECL (celui du package PHP de Marc Liyanage, pas celui de MAMP !). comme ceci :
macbookpro:~/ moi$ sudo /usr/local/php5/bin/pecl install xdebug
après quelques dizaines de secondes, le téléchargement des source et la compilation sont effectués. le nouveau module a été copié dans /usr/local/php5/lib/php/extensions/no-debug-non-zts-20050922 . Il va falloir, d'une part basculer les droits pour coller avec ceux de MAMP, puis déplacer le module dans le dossier des extensions Zend de MAMP :
sudo chown moi /usr/local/php5/lib/php/extensions/no-debug-non-zts-20050922/xdebug.so
sudo chgrp admin /usr/local/php5/lib/php/extensions/no-debug-non-zts-20050922/xdebug.so
cp /usr/local/php5/lib/php/extensions/no-debug-non-zts-20050922/xdebug.so /Applications/MAMP/bin/php5/lib/php/extensions/no-debug-non-zts-20050922/xdebug.so
Ne reste plus qu'à ajouter une ligne à notre php.ini :
echo zend_extension=/Applications/MAMP/bin/php5/lib/php/extensions/no-debug-non-zts-20050922/xdebug.so >> /Applications/MAMP/conf/php5/php.ini
Et redémarrer les serveurs depuis l'interface MAMP.
Il ne vous reste plus qu'à vérifier que le module est bien chargé, en allant consulter le phpinfo(); (si vous lisez cet article, vous savez faire, non ?...)
Premières utilisations
On peut déjà utiliser Xdebug directement dans notre code PHP. Le module xdebug.so ajoute quelques fonctions PHP (consultez la liste complète dans la documentation de xdebug).
Premier exemple de base, remplacer le gestionnaire d'erreurs de PHP par celui de Xdebug :
<?php
xdebug_enable();
fonction_a_la_con_qu_existe_pas();
?>
Allez voir ce que ça donne :
Wowo que c 'est bô !!!
L'intérêt semble limité pour un simple appel de fonction, mais la pile de traçage devient vite très intéressante lorsque l'on se retrouve à gérer des erreurs dans une imbrication multiple d'objets.
Je vous invite, à partir de ce point, à explorer les différentes fonctions xdebug, dans la doc correspondant (voir lien plus haut). Attention la version 1.3 et la version 2 (celle qu'on a installé) fonctionnent tout à fait différemment.
En tout cas, le top avec xdebug, c'est d'utiliser une interface graphique pour profiler son application. Comme souvent sur mac, on est à la traine et il faut jouer des coudes pour trouver ce dont on a besoin. Heureusement que cet OS est le plus agréable du monde, ça fait oublier ces petits désagréments ;). Heureusement il y a Fink grâce auquel nous allons pouvoir installer Kcachegrind....
Installation de Kcachegrind
bas débit s'abstenir !
Pour installer Kcachegrind sur mac osX, il faut également récupérer un paquet de paquets liés à l'environnement graphique KDE. La solution la plus simple pour ne pas s'empêtrer dans les dépendances, est de laisser faire Fink. Il saura installer tout ce dont on aura besoin pour faire tourner la bête. Mais avant d'installer Fink, assure-vous d'avoir installé :
- Les Developer Tools (Fink a besoin de gcc entre autres)
- X11 (KDE tourne sur un moteur de ce type)
Ensuite, récupérez l'installeur de fink ici. L'installation se fait classiquement par un .pkg. L'installeur crée un répertoire sw en racine de votre disque système, tout ce que fink installera, ce sera dans ce dossier.
Si vous êtes habitué à apt-get, pear, pecl ou dselect, sachez que fink est un gestionnaire de packages au fonctionnement similaire à ceux-ci, mais il est spécialisé dans le port d'application unix sur mac. Dans le même genre il existe Darwinports. Je n'ai pas testé, mais je pense que si les packages KDE sont dispo sur darwinports on doit arriver au même résultat.
Passons au rapatriement de kacachegrind et toute la cohorte de packages (140 pour moi) nécessaires à son bon fonctionnement. Je n'ai pas compté mais on doit pas être loin du gigaoctet, donc faites chauffer les modems !
D'abord, il faut configurer, et tant qu'à faire, mettre à jour Fink. Kcachegrind n'étant disponible qu'en statut beta, il faut indiquer dans la config que l'on souhaite pouvoir utiliser des packages en beta.
Retour dans le terminal :
vi /sw/etc/fink.conf
Et effectuez la modification suivante :
# Avant
Trees: local/main stable/main stable/crypto
# Après
Trees: local/main stable/main stable/crypto unstable/crypto unstable/main
voilà maintenant mise à jour de Fink et réindexation des packages :
fink selfupdate; fink index; fink scanpackages
Allez boire un café....
...
...
voilà, la journée doit être pas loin de se terminer pour lancer ce qui suit, téléchargement et compilation qui vont prendre... du temps :
sudo fink install kcachegrind
Répondez tout de même aux quelques questions (laissez les valeurs par défaut par exemple, ça suffit) pour que l'opération démarre.
....
....
Le lendemain matin...
Je vous souhaite de tout coeur qu'aucune erreur n'apparaisse dans votre terminal, en principe tout a bien du se passer, kcachegrind est prêt à être lancé. Il se trouve dans /sw/bin/kcachegrind.
Pour qu'il fonctionne correctement, il doit être lancé depuis X11, par le terminal. Vous pouvez ajouter le chemin de l'exécutable au menu Applications, c'est fait pour ça.
Vous devez obtenir quelque chose comme ça :

Vous savez quoi : on y est presque !
Ne reste plus qu'à configurer xdebug (on retourne dans le php.ini s'il vous plait)
xdebug.profiler_enable="1"
xdebug.profiler_output_dir="/Applications/MAMP/tmp/xdebug/"
Les valeur "xdebug.trace_output_dir" et "xdebug.profiler_output_dir" sont modifiables par l'emplacement où vous souhaiter enregistrer les fichiers de profiling.
Relancez le serveur apache
Lancez une page web PHP de votre serveur local, un fichier de profiling est créé à l'endroit que vous souhaitez. Il ne vous reste plus qu'à ouvrir ce fichier (extension .out) dans kcachegrind. Excellent !
Ci-dessous un profil d'un des sites que j'ai monté. Le retour visuel est immédiat et sans appel : mon système d'internationalisation, utilisant PEAR::XML_Serializer, a sérieusement besoin d'un système de cache :

Amusez-vous bien, n'hésitez pas à émettre remarques ou suggestions sur ce billet.
Voici la liste des articles écrits ça et là, qui m'ont aidé à monter cet environnement.
EDIT : si vous êtes sur php 5.2 un brave ch'ti gars de chez Komodo propose les binaires pour Linux/macosX/Win32 par ici :
PHP 5.2 / xdebug builds
EDIT2 : souhaitant installer PHPunit 3, qui demande xDebug version 2, je me suis retrouvé coincé (après un changement de machine) car le package d'entropy est passé en php 5.2, et toujours pas MAMP (ben ouais j'ai pas upgradé). Donc là, le seul moeyn reste l'extension compilée de komodo. Elle est récupérable directement dans l'application elle-même.