L’objectif de cet article est de vous présenter un moyen de débugger relativement simplement des scripts PHP directement sur un serveur sur lequel vous êtes connecté à distance via SSH.
Crash course
#!/bin/bash #Install vdebug on a server https://www.octopuce.fr/debugger-php-en-cli-avec-xdebug-vim/ [ -z which sudo ] && echo "Vous devez installer Sudo d'abord !" sudo apt-get install curl git php5-cli php5-xdebug vim-nox XDEBUG_PATH=$(find /usr/ -name "xdebug.so" | tail -n 1) echo "Configure xdebug..." echo -e " zendextension=$XDEBUG_PATH xdebug.remote_enable=1 xdebug.remote_port=9000 xdebug.remote_host=localhost xdebug.remote_autostart=1 xdebug.idekey=vim_session " > /etc/php5/cli/conf.d/20-xdebug.ini echo "Installe pathogen et vdebug..." mkdir -p ~/.vim/autoload ~/.vim/bundle curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim cd ~/.vim/bundle && git clone git@github.com:joonty/vdebug.git echo "Changements dans .vimrc..." echo -e " execute pathogen#infect() call pathogen#helptags() let g:vdebug_options = {} let g:vdebug_options['port'] = 9000 " >> ~/.vimrc echo "Ajoute l'idekey dans .bashrc..." echo 'export XDEBUGIDEKEY=\"idekey=vim_session\"' >> ~/.bashrc source ~/.bashrc
Introduction
Formidable outil permettant de debugger pas à pas, Xdebug est très apprécié pour son intégration dans quantité d’IDE: phpStorm, Atom, NetBeans, Sublime Text, etc. Généralement, on active Xdebug sur son serveur, et en configurant son IDE, on est capable de débugger à distance un script qui tourne sur une requète Http. Mais comment faire, dans le cas de l’execution d’un script en cli, pour débugger en local.
Exemple via ssh sur un serveur distant.
Prérequis concernant le serveur sur lequel vous voulez débugger :
- Debian Wheezy ou Jessie
- Php 5.3 minimum
- Vim, compilé avec le support de Python comme langage de script (fournis sous debian par le paquet vim-nox)
- Xdebug
- Git (optionnel)
Xdebug, donne moi la puissance….
Nous allons utiliser une configuration un peu particulière pour le Xdebug que vous avez installé.
Elle passe Xdebug en débuggeur pas à pas, mais pour interagir avec un client en local.
Ouvrez le fichier .ini relatif à votre configuration : /etc/php5/cli/php.ini ou /etc/php5/cli/conf.d/20-xdebug.ini .
Vous devez vous assurez qu’y figurent les lignes suivantes:
zendextension = /chemin/vers/xdebug.so ; Demande à xdebug de contacter un client (ici vim) selon ; les informations spécifiées par xdebug.remoteenable et ; xdebug.remoteport xdebug.remoteenable = 1 ; Dans notre cas, notre client écoute sur le port 9000, et nous somme en local xdebug.remoteport =9000 xdebug.remotehost = localhost ; Normalement, xdebug attend de recevoir un Cookie ou un argument spécifique ; dans une requete GET ou POST. En passant cette option, on demande à ; xdebug de toujours tenter une connection à un hypothétique client ; à chaque lancement de php ; Attention: laisser cette option à 1 peut freiner les performances de php xdebug.remote_autostart=1 ; Clé passée par xdebug à DBGP pour communiquer avec le client, et qui dépend de ; son environnement. Ici, on utilisera vimsession comme valeur pour xdebug.idekey xdebug.idekey=vimsession
La documentation officielle de Xdebug vous donnera toutes les options de configuration.
Vim ma vie de développeur
Le plugin Vdebug (écrit en python) interface Vim avec n’importe quel debuggueur utilisant le protocole DBGP, pour Php (ici, Xdebug), Python, Ruby, Perl ou encore NodeJs. Son rôle : transformer ici vim en client Xdebug.
Les gestionnaires de plugins offrent une facilité d’installation et de gestion. Nous allons pour notre part utiliser Pathogen. Il s’installe ainsi :
mkdir -p ~/.vim/autoload ~/.vim/bundle && \ curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim
Pathogen est maintenant installé dans ~/.vim/autoload/pathogen.vim.
Les quelques lignes au dessus créent les dossiers suivants :
~/.vim/autoload
, dans lequel se trouve pathogen,~/.vim/bundle
, dans lequel nous allons placer nos plugins pour vim
En l’occurence nous allons y ajouter vdebug :
cd ~/.vim/bundle && git clone git@github.com:joonty/vdebug.git
Maintenant, reste à éditer le .vimrc de votre utilisateur :
" ~/.vimrc " On active Pathogen: execute pathogen#infect() call pathogen#helptags() " Puis quelque option pour vdebug: let g:vdebugoptions = {} let g:vdebugoptions["port"] = 9000
Pour valider l’installation de vdebug, ouvrez un script avec vim et appuyez sur F5. Si tout s’est bien passé le message » Waiting for a connection (Ctrl-C to cancel, this message will self-destruct in 20 seconds…) » devrait s’afficher.
Et maintenant, testons!
Vdebug ain’t afraid of no bug !
Nous allons travailler dans un environnement Terminator avec 2 terminaux l’un à côté de l’autre.
Vous êtes connecté en SSH sur le serveur dans un premier panneau. Indiquez à Xdebug votre idekey:
export XDEBUG_IDEKEY="idekey=vim_session"
Ouvrez le script que vous souhaitez débugger avec vim, dans un second panneau.
vim example.php
Vdebug s’utilise de la manière suivante:
<F10>
pour poser un point d’arrêt<F5>
pour lancer une session xdebug<F6>
pour quitter une session xdebug
Placez un point d’arrêt, puis lancez une session xdebug avec F5.
Lançons le script:
php example.php
Si tout se passe bien, un nouvel onglet s’ouvre automatiquement dans vim, avec 4 panneaux:
- Le panneau de gauche, c’est votre script : la ligne rouge représente l’execution en cours, les lignes vertes vos points d’arrêt
- Sur votre droite, trois panneaux:
- En haut, l’état des variables
- Au milieu, le stack
- En bas, l’état de xdebug
Tips :
Utilisation des onglets dans vim
Pour ouvrir plusieurs fichiers dans vim, lancez
vim -p fichier1, fichier2, fichier3Dans vim, pour ouvrir un fichier dans un nouvel onglet, lancez
:
:tabedit mon_fichier
Naviguez entre les onglets avec gt
pour passer à l’onglet de droite, et gT pour l’onglet de gauche. Entrez :q pour quitter un onglet.
Utiliser la souris dans vim
Pour pouvoir redimensionner les panneaux dans l’onglet de débug, utilisez votre souris en lançant sur vim:
:set mouse=aCette commande active le support de la souris pour tous les modes de vim. Attention, il n’est disponible que si vous utilisez un terminal type xterm. Pour désactiver l’option :
:set mouse=Obtenez plus d’informations concernant le support de la souris avec la commande:
:help mouse
En cours de session, différentes commandes à retenir:
<F5>
Passer au prochain point d’arrêt<F2>
Passer à la prochaine instruction<F3>
Rentrer dans l’instruction<F4>
Sortir de l’instruction<F6>
Arrêter la session
Pour obtenir plus d’information sur vdebug, lancez dans vim:
:help vdebug
Liens utiles
- Débugger PHP avec Vim et Xdebug en 10 minutes : http://blog.rot13.org/2008/08/10-minutes-to-interactive-php-debugger-in-vim.html
- Transformer Vim en IDE PHP: http://blog.joncairns.com/2012/05/using-vim-as-a-php-ide/
- Débugger à distance un script PHP avec Xdebug et Vim : https://ccpalettes.wordpress.com/2013/06/03/remote-debugging-php-with-vim-and-xdebug/
Happy debugging!