Retour

Débugger avec xDebug

15 déc. 2016
5mn

Bien que la plupart des développeurs PHP connaissent l'existence de xDebug, je me rends compte que bien peu l'utilisent réellement, et souvent se laissent tenter par la méthode « à l'ancienne » du var_dump(); die;.

Dans cet article je vais tenter de vous familiariser avec cet outil d'une incroyable utilité, qui vous fera gagner un temps fou pour débugger vos applications.

Les bases

Le principe est assez simple : On place tout d'abord un ou plusieurs points d'arrêt dans le code, là où on veut interrompre l'exécution du script. Lorsque l'on accède à une URL via le navigateur, xDebug intercepte l'appel et déclenche une session de debug en notifiant l'IDE. On retrouve alors dans l'IDE la valeur des variables du scope courant ainsi que la pile d'appels. Le plus sympathique est de pouvoir avancer l'exécution pas à pas en naviguant dans les appels de fonctions tout en gardant un œil sur les valeurs des variables présentes dans le scope.

Il est également possible de débugger les scripts en mode CLI. C'est exactement le même principe.

Prérequis

Si ce n'est pas déjà le cas, il faut installer et activer l'extension xDebug.

Sur ubuntu cela donne :

sudo apt-get install php-xdebug

Pour les autres systèmes je vous invite à voir la documentation officielle.

Normalement l'extension doit maintenant être chargée avec PHP :

php -m | grep xdebug xdebug

Vous aurez également besoin d'un IDE, ici nous verrons un exemple avec PHPStorm, mais bien d'autres sont compatibles en installant simplement un plugin (NetBeans, Atom, SublimeText, etc...)

Remote debugging (web)

Dans cette section nous verrons comment utiliser xDebug avec votre IDE pour débugger une application web sur un serveur distant (ou même en local).

Pour activer le debug distant, nous avons besoin de modifier la config php.ini :

xdebug.remote_enable=On # Activer le debug distant xdebug.remote_connect_back=On # xDebug va automatiquement se connecter sur l'IP présente dans $_SERVER['REMOTE_ADDR'] xdebug.remote_host=localhost # Host à contacter si remote_connect_back est désactivé ou dans un contexte CLI xdebug.remote_port=9000 # Port par défaut xdebug.idekey=idekey # Identifiant de session utilisé par l'IDE

Ensuite, configurons PHPStorm :

On va dans Run > Edit configurations, puis cliquer sur le symbole « + » Dans la liste on clique sur « PHP Remote Debug ».

Nommez votre configuration et renseignez l'idekey, ici « idekey » comme configuré dans le php.ini. On ajoute ensuite un serveur en cliquent sur le bouton « ... »

Dans cet exemple je fais tourner un server en local, mon host distant est en fait localhost. On laisse le port 80 et on sélectionne évidemment « xDebug ». Il faut également mapper les fichiers PHP locaux avec ceux qui se trouvent sur le serveur (pour que l'IDE reconnaisse les fichiers que xDebug lui communique). Ici mon projet se trouve dans /var/www sur le serveur distant.

Maintenant il ne nous reste plus qu'à poser un point d'arrêt dans le code et d'écouter les connections de xDebug (bouton à droite sur l'image) :

Pour déclencher la session de debug, nous devons passer la variable XDEBUG_SESSION_START en query string avec comme valeur notre idekey.

Il est également possible de passer par un cookie, mais le plus simple est d'utiliser un plugin sur votre navigateur (Xdebug helper pour chrome, The easiest debug pour firefox) qui vous permet en un clic d'activer le debugging.

Et HOP ! PHPStorm surgit tout à coup et nous montre tout ce qui se passe à l'endroit de notre point d'arrêt ! On peut même avancer l'exécution au pas à pas !

Debugger les scripts CLI

Pour utiliser xDebug sur un script CLI (exécuter un simple fichier PHP ou une commande Symfony par exemple), la démarche est exactement la même. Mais cette fois xDebug ne peut plus déterminer sur quelle IP se connecter pour lancer la session de debug. La propriété xdebug.remote_connect_back n'est d'aucune utilité. Nous devons spécifier sur quel hôte nous voulons être contactés en utilisant la propriété xdebug.remote_host (localhost par défaut).

Voici à quoi ressemble notre configuration php.ini (celui du CLI cette fois) :

xdebug.remote_enable=On # Activer le debug distant xdebug.remote_host=localhost # Host à contacter (obligatoire en mode CLI) xdebug.remote_port=9000 # Port par défaut xdebug.idekey=idekey # Identifiant de session utilisé par l'IDE

La configuration reste similaire, mais en mode CLI nous ne voulons pas forcément lancer du debug à chaque commande PHP. Je vous conseille plutôt de ne pas activer le remote debugging dans le php.ini, mais directement en lançant la commande PHP :

export XDEBUG_CONFIG="remote_enable=1" # Démarrage de la session php bin/console xdebug:test ... unset XDEBUG_CONFIG # Fin de session

Ou encore :

XDEBUG_CONFIG="remote_enable=1" php bin/console xdebug:test

Pour débugger en mode CLI sur un serveur distant, vous devez simplement changer la valeur de xdebug.remote_host dans le php.ini par votre IP.

Conclusion

L'utilisation de xDebug ne demande pas 5 ans d'études ! Alors utilisez-le, vu l'énorme gain de temps qu'il apporte par rapport à du debug à la main, que ce soit en web ou en CLI, en local ou sur un serveur distant, vous n'avez plus d'excuse !


Articles sur le même thème

Comment créer de la dette technique dès le début d’un nouveau projet ?

Quand on arrive sur un projet existant, on doit souvent subir une dette technique qui nous fait perdre du temps et qui nous rend fou au point de vérifier qui a fait le code. Vous aussi vous voulez entrer dans la postérité lors d’un git blame et mal concevoir votre produit ?

9 août 20238mnMarianne Joseph-Géhannin

Découvrez Eleven Labs

Notre site pour mieux nous connaître

J'y vais

Contact

Eleven Labs - Paris

102, rue du Faubourg Saint Honoré

75008 Paris

Eleven Labs - Nantes

42, rue la Tour d'Auvergne

44200 Nantes

Eleven Labs - Montréal

1155, Metcalfe St Suite 1500

Montréal, QC H3B 2V6, Canada

business@eleven-labs.com

01.82.83.11.75