Les derniers articles
Introduction à Xdebug 1
Date :: 2005-09-28
Last Updated :: 2006-06-18
Introduction
Xdebug
est une extension pour PHP (PHP4 et PHP5)
écrite par Derick Rethans
et disponible dans
PECL
qui vous permet de faire du déboguage avancé de vos scripts, ainsi que du traçage,
et surtout du profiling.
Le profiling va vous permettre notamment de cerner précisément les portions de vos scripts les plus gourmandes
en temps d'exécution, en utilisation de la mémoire, et ainsi vous permettre d'envisager les optimisations
nécessaires.
Installation
Il existe plusieurs manières d'installer Xdebug.
Unix/Linux
La manière la plus simple de procéder pour installer Xdebug, est de disposer de pear et phpize. Lancez simplement cette commande en tant que root dans une console :
ou
Rajoutez ensuite la ligne de chargement du module dans votre php.ini, en prenant soin de renseigner correctement les différents chemins :
Vous pouvez également installer Xdebug en compilant les sources. Pour les utilisateurs de debian, il est également possible d'utiliser le paquet pré-compilé fourni par dotdeb.org. Attention cependant, la version installée sera la 2.0beta.
Windows
Il vous suffit de télécharger la DLL(PHP 5.0x), de la placer dans le répertoire de votre choix, et de rajouter la ligne qui suit dans votre php.ini :
Notes relatives à l'installation **
Personnellement, le fait de rajouter zend_extension= (comme indiqué dans la documentation officielle) dans le php.ini me fait planter PHP, par contre, en ne mettant que extension=, cela fonctionne très bien.
Vérifier si le module est actif
Il y a plusieurs méthodes pour vérifier que le module Xdebug est bien chargé, vous pouvez exécuter un phpinfo() ou encore lancer ce petit script :
if(function_exists('xdebug_enable')) {
echo 'Le module Xdebug est bien chargé';
} else {
echo 'Le module Xdebug n\'est pas chargé';
}
?>
Remplacer l'affichage des erreurs de PHP par celui de Xdebug
Une première fonctionnalité basique de Xdebug est le remplacement de l'affichage des erreurs générées par PHP, assez austère on peut le dire, par quelque chose d'un peu plus convivial :
xdebug_enable();
// Utilisation d'une fonction indéfinie
plouf();
?>
Résultat
Vous allez me dire, c'est pas grand chose. Mais si l'on prend une erreur un peu plus complexe,
on se rend compte que l'on dispose également du traçage de l'erreur,
ce qui s'avère déjà beaucoup plus intéressant en vue du déboguage de vos scripts.
Soit le code suivant :
xdebug_enable();
function bar() {
// fonction indéfinie
foo();
}
bar();
?>
Voici ce qui sera affiché par Xdebug :
Un exemple simple de traçage des fonctions
Après avoir vu des scripts qui ne marchent pas (erreurs),
intéressons-nous maintenant à ceux qui marchent ...
Prenons un simple code PHP, et voyons ce que Xdebug nous renvoie :
- xdebug_enable : Définie si Xdebug doit être appellé en cas d'erreur. Voir aussi les fonctions xdebug_disable() et xdebug_is_enabled(). Notez que lors de l'installation du module, la variable de configuration xdebug.default_enable est positionnée sur 1, donc l'appel à cette fonction est optionnel.
- xdebug_start_trace : Débute le traçage des fonctions.
- xdebug_dump_function_trace : Affiche le résultat du traçage sous la forme d'un tableau.
- xdebug_stop_trace : Arrête le traçage.
xdebug_enable();
xdebug_start_trace();
/*
La fonction que nous allons traçer
*/
$variable = substr('plouf', 0 , 2);
xdebug_dump_function_trace();
xdebug_stop_trace();
?>
Résultat
On remarque plusieurs choses :
- time : Temps d'execution du script depuis que la fonction xdebug_start_trace() a été appellée
- Function : La fonction qui a été tracée. Si cette fonction est une fonction interne à PHP (comme dans notre exemple), un lien vers la documentation sur php.net sera inséré. Vous pouvez personnaliser l'URL de ce lien via la directive xdebug.manual_url du php.ini ou via la fonction ini_set().
- Location : Le fichier et la ligne où la fonction a été traçée.
- Memory : La mémoire utilisée.
Exemple un peu plus complexe de traçage
Définissons donc, à titre d'exemple, une classe PHP contenant deux méthodes.
dl('xdebug.so');
class plouf {
function foo() {
return true;
}
function bar() {
$T = get_defined_functions();
return preg_grep('`^xdebug`', $T['internal']);
}
}
xdebug_enable();
xdebug_start_trace();
$plouf = new plouf;
$plouf -> foo();
$plouf -> bar();
xdebug_dump_function_trace();
xdebug_stop_trace();
?>
Résultat
On remarque tout de suite que la fonction preg_grep() est très gourmande, que ce soit en temps d'exécution ou en occupation mémoire, mais, en auriez-vous douté ? :)
A partir de ce tableau, vous pouvez déjà commencer à voir où sont situés les passages les plus gourmands de vos scripts, et si besoin, agir en conséquence.
Profiling
Code mis en oeuvre
Les fonctions de profiling vous fournissent un outil puissant pour déterminer précisément les lacunes de votre code et ainsi l'optimiser.
Les fonctions utilisées :
- xdebug_start_profiling : Démarre le profiling.
- xdebug_dump_function_profile : Affichage des résultats du profiling dans un tableau HTML. Cette fonction accepte un argument, un entier compris entre 0 et 9 qui permet de trier les résultats différemment. On aurait pu également utiliser la fonction xdebug_get_function_profiling(). qui renvoie les informations dans un tableau PHP, au lieu de les afficher.
- xdebug_stop_profiling : Arrête le profiling.
class plouf {
function foo() {
return true;
}
function bar() {
$T = get_defined_functions();
return preg_grep('`xdebug`', $T['internal']);
}
}
xdebug_enable();
xdebug_start_profiling();
$plouf = new plouf;
$plouf -> foo();
$plouf -> bar();
xdebug_dump_function_profile(0);
xdebug_stop_profiling();
?>
Résultat
Explication du résultat
Le premier tableau ne nécessite pas de commentaires particuliers,
on notera simplement qu'il est trié en fonction du numéro de ligne
(voir chapitre suivant sur le options de tri),
et que les valeurs de temps d'exécution renvoyée (time taken) correspondent
au temps que chaque portion a mis pour s'exécuter, et non plus à un temps global depuis le début du script,
comme pour le traçage.
Le second tableau, par contre, apporte de nouveaux éléments :
- Opcode compiling : Temps que le Zend Engine a mis pour générer l'opcode.
- Function Execution : Temps qu'ont pris les fonctions pour s'exécuter.
- Ambient Code Execution : Reste du temps d'exécution du code (sans les fonctions, donc)
- Total Execution : Temps total d'exécution, c'est la somme de Function Execution et de Ambient Code Execution.
- Total Processing : Temps total pour servir la page. C'est la somme de Opcode Compiling et de Total Execution.
Tri des résultats
Il est donc possible d'effectuer différents tris sur les résultats, en modifiant la valeur du parametre optionnel passé à la fonction xdebug_dump_function_profile() :
- 0 : Mode par défaut. Le tri est effectué sur le temps d'exécution et trié en fonction du numéro de ligne.
- 1 : Le tri est effectué sur le temps d'exécution de chaque portion.
- 2 : Le tri est effectué en fonction du nombre d'appels de chaque fonction, puis par numéro de ligne.
- 3 : Le tri est effectué sur la moyenne du temps d'exécution de chaque fonction.
- 4 : Identique au précédent, hormis que le tri s'effectue sur le temps total d'exécution de chaque fonction.
- 5 : Identique au mode 3, hormis que le tri est effectué sur le nombre d'appels de chaque fonction.
- 6 : Représentation par bloc de code, trié sur le numéro de ligne.
- 7 : Idem que le précédent, hormis que les blocs sont triés en fonction de leur temps d'exécution.
- 8 : Idem que le mode 6, les blocs sont triés en fonction du nombre d'appels des fonctions.
Version des applications utilisées
- Debian GNU/Linux
- PHP 5.1.4 (CGI)
- PEAR 1.4.1
- Xdebug 1.3.2
Notes
La version 1.3.2 de Xdebug, utilisée pour les tests de cet article, n'est plus mise à jour depuis un moment, mais gardez à l'esprit que c'est à l'heure actuelle la seule version stable, et qu'elle fonctionne parfaitement bien. Une version 2.0 offrant beaucoup plus de fonctionnalités, notamment la génération de fichier cachegrind (cela vous permet d'analyser les résultats grâce à des logiciels comme KCacheGrind ou encore WinCacheGrind), est en cours de développement.
Liens utiles
Conclusion
Comme tout bon développeur, l'optimisation de votre code est une priorité. Avec Xdebug, vous disposez d'une aide précieuse (et puissante) dans cette optique, ne vous en privez pas ...
Fabrice Lezoray < fabrice AT scriptsphp.org >.
Trackback
Il n'y a pas de trackback recensé pour cet article.
Faire un trackback sur cet article http://classes.scriptsphp.org/Trackbackserver.Xdebug, récupérer les trackback sur cet article