Php xdebug

De The Linux Craftsman
Aller à la navigation Aller à la recherche

Introduction

Xdebug est une extension qui facilite le développement et le débogage des scripts / applications PHP. Vous pouvez mettre des points d'arrêts dans votre code pour stopper l'exécution de votre code et voir le contenu des variables.

Xdebug permet :

  • de voir les « Stack Traces » et ainsi afficher la pile d’appels des fonctions menant à l’erreur ;
  • d'afficher les informations de profiling permettant de mesurer combien de temps a été passé dans une fonctions pour ainsi optimiser une application ;
  • d'analyser la couverture du code pour effectuer de meilleurs tests.

Installation

Avant d'aller plus loin, n'oubliez pas que le dépôt Webtatic permet d'installer les dernières version de PHP.


L'installation n'est pas très compliquée, une fois que vous avez identifié votre version de PHP :

#  php -v
PHP 7.0.18 (cli) (built: Apr 15 2017 07:29:51) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies

Il suffit d'installer la bonne version de Xdebug :

# yum -y search xdebug
Modules complémentaires chargés : fastestmirror
Loading mirror speeds from cached hostfile
 * base: centos.mirror.ate.info
 * epel: mirror.ibcp.fr
 * extras: centos.mirror.ate.info
 * updates: mirrors.standaloneinstaller.com
 * webtatic: uk.repo.webtatic.com
========================================== N/S Matched: xdebug ==========================================
php-pecl-xdebug.x86_64 : PECL package for debugging PHP scripts
php55w-pecl-xdebug.x86_64 : PECL package for debugging PHP scripts
php56w-pecl-xdebug.x86_64 : PECL package for debugging PHP scripts
php70w-pecl-xdebug.x86_64 : PECL package for debugging PHP scripts
php71w-pecl-xdebug.x86_64 : PECL package for debugging PHP scripts

Dans ce cas précis, la bonne version est la 7.0 :

# yum -y install php70w-pecl-xdebug.x86_64

Configuration de PHP

Il faut maintenant configurer PHP pour qu'il active Xdebug à chaque fois que l'on exécute un script.

Vous pouvez procéder de deux façons différentes. Soit on applique cette configuration à l'intégralité de la machine, soit on créer un fichier de configuration spécialement pour Xdebug.

Pour ajouter la configuration Xdebug à toute la machine, il faut effectuer les modifications suivante directement dans le fichier /etc/php.d/xdebug.ini. Sinon, vous pouvez copier le fichier php.ini en php-xdebug.ini avant d'ajouter les modifications à la fin :

; Configure les quantités de données affichées par la fonction var_dump
xdebug.var_display_max_children = 128
xdebug.var_display_max_data = 1024
xdebug.var_display_max_depth = 8

; Configure les données affichées dans les stack traces
xdebug.collect_includes = 1     ; Noms de fichiers
xdebug.collect_params = 2       ; Paramètres de fonctions / méthodes

; Affiche une stack trace à chaque fois qu'une exception est levée, même si elle est catchee
xdebug.show_exception_trace = 0

; Le nombre maximal de profondeur d'appels de fonctions
; (Sécurité contre les récursions infinies)
xdebug.max_nesting_level = 64

Exemple d'affichage

CLI

Prenons le code suivant :

<?php
$debug = array (
			'hello, world!',
			array (	'1','2' => ( object ) array (	'chaine',1,TRUE)),
			array ('xml' => simplexml_load_string ( 
					'<?xml version="1.0" encoding="UTF-8"?>
						<root>
    						<utilisateur id="1">
        						<name>Jc</name>
        						<age>31</age>
    						</utilisateur>
    						<utilisateur id="2">
        						<name>Gérard</name>
        						<age>50</age>
    						</utilisateur>
						</root>' 
					) 
			) 
);

var_dump ( $debug );

?>

Cet exemple affichera les données comme ceci :

Au lieu de :

# php -f test.php
/root/workspace/XDebug/src/test.php:21:
array(3) {
  [0] =>
  string(13) "hello, world!"
  [1] =>
  array(2) {
    [0] =>
    string(1) "1"
    [2] =>
    class stdClass#1 (3) {
      public ${0} =>
      string(6) "chaine"
      public ${1} =>
      int(1)
      public ${2} =>
      bool(true)
    }
  }
  [2] =>
  array(1) {
    'xml' =>
    class SimpleXMLElement#2 (1) {
      public $utilisateur =>
      array(2) {
        [0] =>
        class SimpleXMLElement#3 (3) {
          public $@attributes =>
          array(1) {
            'id' =>
            string(1) "1"
          }
          public $name =>
          string(2) "Jc"
          public $age =>
          string(2) "31"
        }
        [1] =>
        class SimpleXMLElement#4 (3) {
          public $@attributes =>
          array(1) {
            'id' =>
            string(1) "2"
          }
          public $name =>
          string(7) "Gérard"
          public $age =>
          string(2) "50"
        }
      }
    }
  }
}
# php -f test.php
array(3) {
  [0]=>
  string(13) "hello, world!"
  [1]=>
  array(2) {
    [0]=>
    string(1) "1"
    [2]=>
    object(stdClass)#1 (3) {
      [0]=>
      string(6) "chaine"
      [1]=>
      int(1)
      [2]=>
      bool(true)
    }
  }
  [2]=>
  array(1) {
    ["xml"]=>
    object(SimpleXMLElement)#2 (1) {
      ["utilisateur"]=>
      array(2) {
        [0]=>
        object(SimpleXMLElement)#3 (3) {
          ["@attributes"]=>
          array(1) {
            ["id"]=>
            string(1) "1"
          }
          ["name"]=>
          string(2) "Jc"
          ["age"]=>
          string(2) "31"
        }
        [1]=>
        object(SimpleXMLElement)#4 (3) {
          ["@attributes"]=>
          array(1) {
            ["id"]=>
            string(1) "2"
          }
          ["name"]=>
          string(7) "Gérard"
          ["age"]=>
          string(2) "50"
        }
      }
    }
  }
}

https://eclipse.org/pdt/

Web

Il en va de même côté Web

Avec Xdebug :

Sans Xdebug :

/var/www/html/test.php:21: array (size=3)

 0 => string 'hello, world!' (length=13)
 1 => 
   array (size=2)
     0 => string '1' (length=1)
     2 => 
       object(stdClass)[1]
         public 0 => string 'chaine' (length=6)
         public 1 => int 1
         public 2 => boolean true
 2 => 
   array (size=1)
     'xml' => 
       object(SimpleXMLElement)[2]
         public 'utilisateur' => 
           array (size=2)
             ...

array(3) { [0]=> string(13) "hello, world!" [1]=> array(2) { [0]=> string(1) "1" [2]=> object(stdClass)#1 (3) { [0]=> string(6) "chaine" [1]=> int(1) [2]=> bool(true) } } [2]=> array(1) { ["xml"]=> object(SimpleXMLElement)#2 (1) { ["utilisateur"]=> array(2) { [0]=> object(SimpleXMLElement)#3 (3) { ["@attributes"]=> array(1) { ["id"]=> string(1) "1" } ["name"]=> string(2) "Jc" ["age"]=> string(2) "31" } [1]=> object(SimpleXMLElement)#4 (3) { ["@attributes"]=> array(1) { ["id"]=> string(1) "2" } ["name"]=> string(7) "Gérard" ["age"]=> string(2) "50" } } } } }

Xdebug n'améliore pas uniquement le rendu de var_dump mais également les stacks trace ou encore les messages d'erreurs !

Arrêter l'exécution

CLI

Tout d'abord, assurez-vous d'avoir correctement configuré Eclipse.

Pour faire du debug de script PHP, il faut spécifier l'utilisation de Xdebug dans les préférences d'Eclipse :

Eclipse xdebug usage.png

Au lieu d'exécuter le script avec le bouton Run Eclipse run button.png il faut le lancer avec le bouton Debug Eclipse debug button.png, ou bien avec le menu contextuel :

Eclipse run-debug contextual menu.png

Lorsque c'est la première fois que vous entrez en mode Debug, Eclipse vous propose de modifier la perspective.

Eclipse run-debug first time perspective.png

Vous pouvez cocher la case et valider pour accéder à la perspective Debug.

Eclipse debug perspective php.png

Web

Ajout d'un serveur Web

Il faut commencer par déclarer notre serveur Apache HTTPd, que l'on à installé, dans Eclipse. Pour cela, direction Window → Preferences → PHP → Server pour cliquer sur le bouton New. Ci-dessous la configuration :

Create php server page 1.png
Create php server page 2.png

Répertoire de travail et URL par défaut

Configuration Xdebug

Création du projet

Le projet Web est comme pour un projet PHP classique, sauf que la partie environnement d'exécution diffère un peu.

Il faut placer le projet dans le répertoire de travail du serveur Web, pour Apache HTTPd, il s'agit de /var/www/html.

Create project httpd working dir.png

Configuration de debug

Une fois le projet créé, il suffit d'ajouter une configuration de debug sur le point d'entrée du site, généralement index.php

Open debug menu.png
Php debug config 1.png
Php debug config 2.png

Ouverture de la fenêtre de debug

Spécification du point d'entrée

Configuration de Xdebug

Phase de debug

Au lieu d'exécuter le script avec le bouton Run Eclipse run button.png il faut le lancer avec le bouton Debug Eclipse debug button.png, ou bien avec le menu contextuel :

Eclipse run-debug web contextual menu.png

Lorsque l'on veut arrêter le debug, il suffit de cliquer sur le bouton stop et le navigateur indique que la session est terminée:

Stop debug.png
Browser end debug.png

Bouton stop

Fin de session debug