Accédez à nos cours concernant des domaines et thématiques différentes. Vous pouvez aussi contribuer en rédigeant des articles.
Consulter les coursParcourez notre annuaire d’écoles, instituts et universités du monde. Si votre école n’est pas listée, vous pouvez l’ajouter très facilement.
Consulter les écolesAccédez à notre messagerie instantanée pour échanger avec d’autres membres inscrits et aussi les invités. Aucune inscription n’est obligatoire.
Accéder au tchat“Le présent article n'a pas encore été revu par un modérateur, pour cela veuillez faire attention quant à son contenu, que nous ne pouvons pas vous garantir son exactitude.”
Xdebug est une extension pour PHP (PHP4 et PHP5) disponible dans PECL qui vous permet de faire du débogage 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.
Il existe plusieurs manières d'installer Xdebug.
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 :
> pear install xdebug
ou
> pecl install xdebug
Rajoutez ensuite la ligne de chargement du module dans votre php.ini, en prenant soin de renseigner correctement les différents chemins :
echo zend_extension=/path/to/xdebug.so >> /path/to/your/php.ini
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.
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 :
zend_extension=/path/to/xdebug.dll
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.
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 :
<?php
if (function_exists('xdebug_enable')) {
echo 'Le module Xdebug est bien chargé';
} else {
echo 'Le module Xdebug n\'est pas chargé';
}
?>
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 :
<?php
xdebug_enable();
// Utilisation d'une fonction indéfinie
plouf();
?>
Vous allez me dire, ce n’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ébogage de vos scripts.
Soit le code suivant :
<?php
xdebug_enable();
function bar() {
// fonction indéfinie
foo();
}
bar();
?>
Voici ce qui sera affiché par Xdebug :
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 :
Les fonctions utilisées :
<?php
xdebug_enable();
xdebug_start_trace();
/*
La fonction que nous allons traçer
*/
$variable = substr('plouf', 0 , 2);
xdebug_dump_function_trace();
xdebug_stop_trace();
?>
On remarque plusieurs choses :
Définissons donc, à titre d'exemple, une classe PHP contenant deux méthodes.
<?php
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();
?>
Que remarque-t-on ?
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.
Les onctions 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 :
<?php
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();
?>
Le premier tableau ne nécessite pas de commentaires particuliers, on notera simplement qu'il est trié en fonction du numéro de ligne, 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 :
Il est donc possible d'effectuer différents tris sur les résultats, en modifiant la valeur du paramètre optionnel passé à la fonction xdebug_dump_function_profile() :
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.
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 ...