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