Débugger un projet Symfony 2 avec Xdebug et Netbeans

Un des avantages à utiliser un IDE est de pouvoir débuguer facilement son code au moment de son exécution, et ce, au sein même de l’éditeur. Netbeans est un de ces IDE, il vous permettra de placer par exemple les traditionnels point d’arrêts (breakpoints) ou d’analyser les valeurs des variables disponibles à un endroit précis de votre code.

Lorsqu’il s’agit d’un simple script php isolé, utiliser un débugueur couplé à un IDE n’est pas très compliqué. En revanche, lorsqu’il faut en faire de même avec des projets utilisant Symfony (mais c’est aussi valable pour les autres frameworks comme Zend ou Code Ingiter), les choses se compliquent un petit peu car il vous faut pouvoir débugueur l’exécution résultant d’une requête fait au front controller de Symfony via une requête à un serveur web.

Pour y arriver, nous avons besoin de Xdebug et son mode « remote » (distant).

Fonctionnement

Lorsque vous allez lancer l’exécution de votre projet web via Netbeans, celui-ci vous demandera à quelle url correspond ce que vous voulez exécuter. Ensuite Netbeans ouvre dans votre navigateur l’url que vous avez précisée en lui ajoutant un paramètre de session spécifique à Xdebug, permettant au module d’apache d’exécuter la demande en débug distant (remote debug). Ce mode de débug permet ainsi à Netbeans de se connecter directement au débugueur et d’ensuite échanger avec lui les infos ou vos actions de débugs.

Schéma de fonctionnement de Xdebug

Mise en place

La procédure suivante vous permettra de débuguer aussi bien des projets symfony 1.4 que des projets Symfony 2.x (et n’importe quelle autres application/projets web en php obligeant le développeur à passer par un serveur web classique pour pouvoir être débugué).

Installer Xdebug

Installez simplement php5-xdebug via aptitude si vous êtes sur Debian ou Ubuntu. Si vous êtes sous Windows ou Mac OS, allez faire un tour sur la doc : http://xdebug.org/docs/install

Configurer Xdebug

La configuration se passe dans le fichier « xdebug.ini« , présent dans /etc/php5/conf.d pour Debian/Ubuntu. Pour les autres OS, have fun.

Pour pouvoir utiliser la fonctionnalité de débug distant, il vous faut définir 4 propriété de Xdebug :

xdebug.remote_enable=on
xdebug.remote_handler=dbgp
xdebug.remote_host=127.0.0.1
xdebug.remote_port=9000

En ce qui concerne « remote_host », remplacez évidement par l’IP de la machine du développeur, en l’occurrence le plus commun sera de mettre « 127.0.0.1 » ou « localhost » si vous êtes sur la meme machine que le serveur, sinon mettez votre ip si c’est une autre machine (virtuelle ou physique) qui héberge votre application.

Configurer Netbeans

Pour finir vous devez configurer votre projet Symfony dans Netbeans.
Clic-droit sur le projet >> Properties >> Run Configuration

« Run As » : laissez par défaut, à savoir « Local Web Site (running on local web server) »
« Project URL » : l’adresse web de votre projet pointant sur l’apache sur lequel est installé xdebug. Il peut être également utile de préciser le front-controller de l’environnement de dev (cf. capture ci-dessous).


Ensuite, afin que Netbeans sache à quel script local correspond les scripts distant exécutés par Xdebug (et dont le chemin sur le serveur apache est transmis à l’IDE pendant le debug), il vous faut faire du « path mapping » autrement dit faire correspondre les chemins des fichiers entre le serveur et votre machine. Cette étape n’est évidement pas utile si votre machine de développement est le serveur web qui exécute Xdebug et que vous développez directement à l’emplacement utilisé par Apache (puisque les chemins seront identiques).

Toujours dans les propriétés du projet et la partie « Run Configuration », cliquez sur « Advanced…« . Si vous souhaitez saisir vous même l’url à tester à chaque débug, cochez « Ask Every Time », sinon laissez sur l’option par défaut. Ensuite le plus important, cliquez sur « New » à droite afin d’ajouter une correspondance entre le chemin du serveur et du client (path mapping). Dans la colonne « Server Path », tapez donc le chemin vers la racine du site sur le serveur, et dans « Project Path » ciblez le dossier de votre version local du même site. Netbeans pourra ainsi savoir quel fichier afficher en fonction du chemin du fichier sur lequel est en train d’avoir lieux le debug via xdebug sur le serveur web.

Debug !

Pour terminer, une fois les éventuels breakpoints placés, il ne vous reste plus qu’à lancer un simple débug de votre site en cliquant sur le bouton suivant :

Puis de saisir l’action Symfony que vous souhaitez débuguer.

Il ne vous reste plus qu’à naviguer dans l’exécution du code avec les habituels « Step into », « Stop over » ou « Step out », puis d’observer les résultats dans la zone de débug de Netbeans.

Plus d’informations sont disponibles sur la doc Xdebug : remote et sur la doc Netbeans : debugging PHP et sur le Blog d’Oracle : path mapping.