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 catchée
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 </source>

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" } } } } }

Arrêter l'exécution