Artisan Numérique

/développement/php/xdebug/ Débugger et profiler une application PHP

Debugger une application PHP se résume souvent à coller des error_log un peu partout dans le code. Mais lorsque le dit code commence à passer une taille critique, cette option devient vite ingérable. C'est là qu'intervient Xdebug, le concurrent libre du debugger de Zend.

Debugger une application PHP se résume souvent à coller des error_log un peu partout dans le code. Mais lorsque le dit code commence à passer une taille critique, cette option devient vite ingérable. C'est là qu'intervient Xdebug, le concurrent libre du debugger de Zend.

Eclipse/PDT et Apache/PHP/XDebug

Pour traquer les cafards, nous allons tout d'abord utiliser Eclipse (3.4 aka Ganymede) et l'excellent plugin PDT (2.x dev).

Une fois le plugin en place, il reste à ajouter Xdebug à la votre plate-forme de test. Je pars du principe qu'Apache et PHP sont déjà installés et que le serveur est en écoute quelque part sur le réseau.

Paramétrage du serveur

Installer XDebug n'est pas bien compliqué, il y a de très fortes chances qu'il soit déjà inclus dans votre distribution. Sous Mandriva, cela passe donc simplement par un urpmi php-xdebug. Sur les debian-like j'imagine qu'un coup d'apt-get ne doit pas tomber très loin.

Une fois le paquet en place, reste à configurer PHP pour qu'il utilise cette nouvelle extension. Toujours sous Mandriva, cela se passe dans le fichier /etc/php.d/A29_xdebug.ini. Là nous allons rechercher une série de variables suivantes à modifier :

# Rien ne sert de démarrer le debugger à chaque F5
xdebug.remote_autostart = Off

xdebug.remote_enable = On
xdebug.remote_host = 10.0.0.10
xdebug.remote_port = 9000
xdebug.remote_handler = "dbgp"

Le principe de XDebug est un peu troublant au démarrage. Lorsqu'éclipse lance le debuggage d'une page, il ouvre au préalable un serveur XDebug sur le port 9000. Lorsqu'Apache affiche la page, le plugin php-xdebug prend la main et cherche à se connecter sur ce serveur. c'est la que le debuggage commence. Du coup, il est nécessaire de spécifier dans A29_xdebug.ini l'adresse IP de la machine sur laquelle tourne eclipse, ici nous avons 10.0.0.10, à remplacer donc par la votre. Si vous travaillez uniquement en local, vous pouvez remplacer cela par localhost.

Extension firefox utile :https://addons.mozilla.org/fr/firefox/addon/easy-xdebug/ Je n'ai pas noté de perte significative de performance en laissant ces options ainsi même lorsque l'on ne debugge pas le code. Peut-être d'autres ont une expérience différente ?

Maintenant, juste un petit coup de redémarrage d'apache et nous pouvons retourner sous Eclipse.

Paramétrage d'eclipse

Là encore, quelques réglages sont nécessaires. Déjà il nous faut configurer un navigateur par défaut. Pour cela, faite un tour dans Windows/Préférences (me demandé pas pourquoi ils ont clocké ça là dedans...), General/Web Browser. Là vous ajouterez votre navigateur préféré en prendrez soin de le cocher une fois l'opération réalisée pour le rendre actif par défaut.

Ne partez pas tout de suite, et allez dans la section PHP/Debug. Là vous pouvez sélectionner xdebug et clicker sur Configure, histoire de vérifier que le host est bien localhost et le port 9000, comme nous l'avions configuré pour PHP.

Voilà, vous pouvez clicker sur OK pour valider ce paramétrage.

Maintenant, il ne nous reste plus qu'à lancer l'application en mode déverminage par Run/Debug As/PHP Web Page. Comme c'est un nouveau lancement, on vous demande une URL qui est généralement fausse. Remplacez cela par celle de la page à tester. Une fois validée, le navigateur s'ouvre et l'exécution s'arrête brutalement sur le première ligne du premier script PHP. Après c'est du classique, vous avez accès au pas à pas (F6), aux points d'arrêt, à la visualisation des variables par survol, l'ajout d'expressions watch, etc...

Amélioration de l'article: Le mode d'utilisation "debuggage via Eclipse" est lourd en développement web. Le mieux est d'activer dans la configuration de XDebug/DBGp le module multisession (use Multisession) et d'accepter les sessions à l'initiative de XDebug (Accept Remote Session (JIT) : Any). Dans le paramétrage PHP/Debug, désactiver le "Break at first line". Ceci fait, il suffit de naviguer sur le site en cours de développement comme d'habitude. De vouloir débugger une portion de code en y posant un point d'arrêt, et en activant la page en mode debuggage dans firefox via easydebug. Beaucoup plus naturel ainsi.

Analyse de performances

L'intérêt de Xdebug ne s'arrête pas au debuggage, loin de là. C'est aussi un formidable outil d'analyse de performance (profiling). Pour activer ce mode, il faut retourner dans le fichier de configuration de Xdebug pour modifier comme suit :

xdebug.profiler_append = Off
xdebug.profiler_enable = On
xdebug.profiler_enable_trigger = Off
xdebug.profiler_output_dir = /tmp
xdebug.profiler_output_name = php_profile.txt

Attention, cette fois il est très claire qu'activer cela nuit gravement aux performances. Activez et désactivez donc xdebug.profiler_enable selon vos besoins.

Une fois le serveur Apache redémarré, il ne vous reste plus qu'à aller faire un tour sur la page qui explose les compteurs de temps. Quant vous avez terminé, retournez voir dans le dossier /tmp où devrait se trouver un php_profile.txt, c'est lui qui contient tous les temps d'exécution enregistrés par Xdebug.

Pour visualiser le résultat, malheureusement il n'existe pas (à ma connaissance) d'application GTK. Mais il y a néanmoins le très bon kcachegrind qui permet une exploration précise et rapide des temps d'exécutions.

Conclusion

Xdebug fait à mon sens parti de la trousse à outil de base lorsque l'on porte sa casquette de développeur (ou pompier ;-) PHP. Il n'empêche pas de coller nos error_log de base mais aide énormément lorsque l'application patine ou qu'un algo part en vrille.

Notes pour une prochaine maj

Il est possible de passer le debugger d'eclipse en mode passif. Pour cela dans PHP/Debug/Installed Debuggers/XDebug/Configure, cocher Use Multisession/Accept remote session (Any)

Ensuite dans une page à debugger, ajouter à l'URL XDEBUG_SESSION_START=nom_session. Processus simplifiable par l'extension firefox https://addons.mozilla.org/en-US/firefox/addon/58688