Logo classes.scriptsphp.org PHP

go to nav bar

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 :

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.

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 :

zend_extension=/path/to/xdebug.dll

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 :

<?php 
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 :

<?php 
xdebug_enable
();

// Utilisation d'une fonction indéfinie
plouf();
?>

Résultat

Résulat

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 :

<?php 
xdebug_enable
();

function 
bar() {
    
// fonction indéfinie
    
foo();
}

bar();

?>

Voici ce qui sera affiché par Xdebug :

Résulat

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 :

Les fonctions utilisées :
  • 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.
<?php 
xdebug_enable
();
xdebug_start_trace();

/*
La fonction que nous allons traçer
*/
$variable substr('plouf'2);

xdebug_dump_function_trace();

xdebug_stop_trace();
?>

Résultat

Résulat de l'éxecution de l'exemple simple

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.

<?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();

?>

Résultat

Résulat
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.

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.
<?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();


?>

Résultat

Résulat du profiling

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

Merci de ne pas suivre ce lien emails.

0.1387s | «»
PHP powered