Nécessaire en local, le débugger xdebug est prévu pour fonctionner en distant, ce qui m’a demandé pas mal de tripatouillage pour le faire fonctionner. Détails.

1. Prérequis

On part du principe que les éléments suivants sont connus / déployés / installés.

  • compte root sur station debian GNU/Linux (crunchbang) : ton laptop
  • compte root sur serveur debian GNU/Linux (debian) : la machine de dev
  • IP publique sur serveur avec port TCP 9000 ouvert vers l’extérieur
  • IP publique (VPN ou routage box) sur station avec port TCP 9000 ouvert depuis l’extérieur
  • installation netbeans 7 sur station
  • installation xdebug sur serveur (Apache2, php5)
  • installation plugin xdebug pour Firefox, Chrome, ou autre.
  • projet PHP dont le code est identique sur le serveur et la station (GIT)

Les tutos pour installer tout ça sont disponibles dans toutes les bonnes crèmeries.

2. Variables

Pour faire ta propre installation, remplacer par tes propres valeurs.

  • %server_url% = URL du code PHP côté serveur (ex: http://www.bibi.org/lambda)
  • %station_url% = URL du code PHP côté station (ex: http://lambda.local)
  • %server_path% = chemin de la racine du code PHP côté serveur (ex: /var/www/vhosts/bibi.org/lambda)
  • %station_path% = chemin de la racine du code PHP côté station (ex: /home/bibi/code/lambda)
  • %server_address% = IP ou hostname du serveur (ex: 1.23.45.67 ou vps123456.ovh.com)
  • %station_address% = IP ou hostname du client (ex: 88.12.34.56 ou home.bibi.org)

3. Schéma

Voici en préambule comment se passe une session de déboggage distant. Ce qui n’est pas évident à comprendre c’est que le serveur web va faire une requête vers la station de travail.

JE REPETE : le serveur web va faire une requête vers la station de travail.
[Station %station_address%] [Serveur %server_address%]

Port random ======{Requete HTTP %server_url%}======> Port 80
Port 9000 <==========={Echanges DBGP }===========> Port random
Port random <====={Réponse HTTP %server_url%}======> Port 80

C’est-à-dire ?

  1. On fait une requête HTTP vers le serveur avec le bon paramètre de query, en session ou en GET, pour signaler le début d’une session xdebug. Le serveur Apache capture cet événement et le transmet à Xdebug.
  2. XDebug ouvre une connection vers le port 9000 de la station pour lire les points d’arrêts, recevoir les commandes et renvoyer les informations de trace / variables / etc.
  3. Une fois le script exécuté, Xdebug clôt sa session et Apache la sienne ensuite, renvoyant le résultat de la requête initiale.

Configuration

A. php5 sur serveur

On doit avoir un fichier /etc/php5/apache2/conf.d/20-xdebug.ini qui ressemble à ça :
zend_extension=/usr/lib/php5/20100525/xdebug.so
xdebug.remote_enable=on
xdebug.remote_log="/var/log/xdebug.log"
; Configuration en mode localhost (exemple donné par netbeans)
; xdebug.remote_host=localhost
; Configuration en mode client distant (remplacer la variable %station_address%)
xdebug.remote_host = %station_address%
xdebug.remote_handler=dbgp
xdebug.remote_port=9000

Cette configuration configure un envoi des paquets DBGP vers la station de travail lorsqu’une session Xdebug commence.

Redémarrer Apache une fois le fichier configuré. Un test phpinfo() dans une page accessible sur le serveur doit désormais contenir l’entrée XDebug avec la mention du remote_host valide.

B. projet netbeans sur station

On va ajouter une nouvelle configuration dans les propriétés du projet.

Clic droit sur le projet, [Properties] puis [Run configuration]. Dans ce tableau Cliquer sur  [New]. On va sauver la configuration actuelle si Xdebug est utilisé pour le projet en localhost :

 [Localhost]
Project URL = %station_url%
Dans {Advanced}:
Path mapping: (vide)

Le path n’a pas besoin d’être défini sur la boucle locale; lorsque Xdebug détecte que le script lit la ligne N d’un fichier, ce fichier est par définition disponible sur le système de fichiers qu’il s’agisse d’un fichier normal ou d’un lien.
Ex: quand xdebug retourne %station_address%/config.php Netbeans ouvre %station_address%/config.php

[Remote]

URL = %server_url%
Dans {Advanced}:
Path: %server_address% | %station_address%

Le path a besoin d’être défini si la structure des fichiers est différente entre le serveur et la station, soit quand %server_address% est différent de %station_address%
Ex: quand xdebug retourne %server_address%/config.php Netbeans ouvre %station_address%/config.php

Une fois cela exécuté, lancer un déboggage du projet.

Si la configuration est bonne xdebug s’active lorsqu’on ouvre une page du serveur avec le plugin xdebug activé, et on a la main sur l’exécution dans son netbeans. Voila.

Troubleshooting

Néanmoins il est probable que ça ne marche pas de suite.

Configuration réseau

L’utilitaire iftop lancé sur le serveur et la station permet de savoir si les 2 sessions (HTTP et DBGP) sont bien ouvertes à l’ouverture de la page web.

Une commande “netstat -plnta |grep java” indique si netbeans ouvre bien le port 9000 vers l’extérieur quand on lance le débug. Il m’est arrivé d’avoir une session qui écoutait en local (9000:127.0.0.1) et non en distant (9000:0.0.0.0). Un redémarrage de netbeans résoud ça.

Path

Il se peut aussi que Netbeans ne fonctionne qu’à moitié si les paths ne sont pas bien configurés. Il m’est arrivé de voir que les points d’arrêt fonctionnaient sans avoir l’affichage de la ligne courante. C’est un indice que xdebug fonctionne mais que netbeans n’arrive pas à synchroniser les informations reçues avec la station locale. Un bon moyen de débugger ça est d’afficher le panneau de traçage qui indique le path courant dans lequel se trouve le PHP du serveur.

De fait, j’ai eu le souci avec la librairie Zend qui était partagée par plusieurs projets et qui ne se trouvaient pas dans le path du projet lui-même. Il a fallu la placer au bon endroit.

De même, les liens semblent ne pas fonctionner correctement.

 

Categories: brogramming

Comments are closed.