Image mise en avant pour l'article

Xdebug : utilisation avancée et bonnes pratiques

7 avril 2025
Bonnes pratiques - PHP
Xdebug est un outil indispensable pour identifier et résoudre rapidement les bugs dans du code PHP, mais pour arriver à cela il est important que l’outil de débogage soit correctement configuré et utilisé.


Dans le développement PHP, optimiser la performance et la qualité du code est primordial pour garantir une expérience utilisateur fluide et réactive. Dans ce second article dédié à Xdebug, nous mettons en lumière l’une de ses fonctionnalités les plus puissantes : le profilage de code. Grâce à cette technique, il devient possible d’analyser en profondeur l’exécution des scripts, d’identifier les goulots d’étranglement et de cibler précisément les zones à améliorer.

Ici, nous aborderons la configuration de Xdebug pour le profilage, des exemples concrets d’utilisation ainsi que les bonnes pratiques pour tirer pleinement parti de cet outil indispensable. Enfin, nous comparerons Xdebug avec d’autres solutions de débogage pour en déterminer les meilleurs cas d’usage.

Si vous ne l’avez pas encore lu, nous vous invitons à prendre connaissance de notre article d’introduction à Xdebug.

Sur la photo, un développeur travaille sur le code d'un site internet en cours de développement

Le profilage de code avec Xdebug

Le profilage de code est une fonctionnalité puissante de Xdebug qui permet d’analyser les performances d’un script PHP en mesurant le temps d’exécution et l’utilisation des ressources pour chaque fonction et méthode appelée. Cet outil est particulièrement utile pour identifier les goulots d’étranglement et optimiser le code afin d’améliorer les performances globales d’une application.

Pourquoi utiliser le profilage de code ?

Le profilage de code présente les intérêts suivants :

  • Détecter les ralentissements : identifiez les parties du code qui prennent le plus de temps à s’exécuter.
  • Optimiser les performances : trouvez les fonctions et requêtes SQL les plus coûteuses pour optimiser leur exécution.
  • Analyser le comportement global : comprenez comment votre application s’exécute et comment les appels de fonctions s’enchaînent.

Activer le mode profilage

Pour activer le profilage de Xdebug, ajoutez la configuration suivante à votre fichier php.ini :

xdebug.mode=profile
xdebug.output_dir=/tmp/xdebug_profiles
xdebug.profiler_output_name=trace.%c%p%r%u.out

Si vous utilisez DDEV :

  • créez un dossier vide xdebug dans votre dossier /.ddev,
  • puis ajoutez un fichier .ini dans le dossier /.ddev/php et contenant la configuration suivante :
    xdebug.mode=profile
    xdebug.output_dir=/var/www/html/.ddev/xdebug
    xdebug.profiler_output_name=trace.%c%p%r%u.out

Lorsqu’un script PHP est exécuté, Xdebug génère un fichier de profilage contenant des données détaillées sur l’exécution du code.

Exemple simple : mesurer l’impact des fonctions

Maintenant que la fonctionnalité de profilage est activée, prenons un premier exemple de cas d’utilisation avec le script PHP suivant :

// Simule un temps de traitement de 0.5 seconde.
function slowFunction() {
  usleep(500000);
}

// Simule un temps de traitement de 0.1 seconde.
function fastFunction() {
  usleep(100000);
}

slowFunction();
fastFunction();

echo "Profilage terminé.\n";

En exécutant ce script avec Xdebug activé, un fichier de profilage est généré dans le dossier indiqué par la valeur de configuration xdebug.output_dir définie précédemment.

Vous pouvez analyser les données de résultat du profilage avec un outil comme Webgrind ou QCacheGrind.

Certains IDE permettent d’analyser directement les fichiers générés. Par exemple, sur VSCode, l’extension PHP Profiler met en évidence les chemins critiques et facilite l’analyse.

Voici les informations que vous pourrez tirer du fichier de profilage :

  • Temps d'exécution des fonctions : quelle fonction prend le plus de temps à s’exécuter ?
  • Consommation mémoire : quel segment du code consomme des ressources excessives ?
  • Appels répétitifs  : y a-t-il des appels redondants qui ralentissent le processus global ?

Voici un exemple d’écran d’analyse via l’extension PHP Profiler :

Exemple d’écran d’analyse via l’extension PHP Profiler

Et un exemple du détail d’une fonction capturé par cette même extension :

Exemple du détail d’une fonction capturé par cette même extension

Le profilage est un excellent moyen de détecter les inefficacités et d’optimiser le code pour des performances accrues. En combinant cette fonctionnalité avec le traçage de pile et l’analyse des variables, Xdebug devient un outil incontournable pour un développement PHP performant.

Configuration du fichier php.ini

Pour exploiter pleinement les fonctionnalités de Xdebug, il est indispensable de configurer correctement l’extension “xdebug” dans le fichier php.ini. Une configuration bien pensée vous permet d’activer ou de désactiver certaines fonctionnalités, d’ajuster les paramètres de performance et de personnaliser le comportement de Xdebug en fonction de vos besoins de développement.

Avant toute modification, vérifiez que Xdebug est bien installé en exécutant la commande suivante dans votre console :

php -v

Si Xdebug est actif, vous verrez dans les informations de retour une ligne mentionnant « with Xdebug ».

Si ce n’est pas le cas, vous devrez installer l’extension en fonction de votre environnement (voir la section d’installation de l’article d’introduction à Xdebug).

Voici maintenant un exemple de configuration de base à ajouter au fichier php.ini :

; Charge l'extension Xdebug.
; Selon votre système, il peut être nécessaire de préciser le chemin complet
; ou d’utiliser "xdebug.so" (Linux/Mac) ou "php_xdebug.dll" (Windows)
zend_extension=xdebug

; Active les modes "debug" et "develop".
; - debug : permet le débogage pas-à-pas.
; - develop : fournit des informations supplémentaires pour le développement (avis, warnings, etc.)
xdebug.mode=debug,develop

; Définir le port de communication avec l’IDE.
; Le port par défaut de Xdebug 3 est 9003, mais il peut être modifié si besoin. xdebug.client_port=9003

; Active le démarrage automatique du débogage à chaque requête HTTP.
; Vous pouvez également utiliser la valeur "trigger" pour n’activer Xdebug qu’en cas de besoin.
xdebug.start_with_request=yes

; Définit l’adresse de l’hôte sur lequel votre IDE est en écoute.
; Attention : si vous travaillez avec des conteneurs (ex. Docker), cette adresse devra être adaptée.
xdebug.client_host=127.0.0.1

; Spécifie le répertoire où seront stockés les fichiers générés par Xdebug (logs, traces, dumps).
; Pour le profilage, vous pouvez utiliser Xdebug.profiler_output_dir si vous activez ce mode.
xdebug.output_dir=/tmp/xdebug
; Exemple pour le profilage :
; xdebug.profiler_output_dir=/tmp/xdebug

; (Optionnel) Affichage du trace d’erreur.
; Remarque : Xdebug affiche par défaut un trace détaillé en cas d’erreur.
; Pour affiner ce comportement, vous pouvez explorer des directives complémentaires comme xdebug.show_exception_trace.
; xdebug.show_error_trace=1

En configurant correctement Xdebug dans votre fichier php.ini, vous optimisez votre processus de débogage et améliorez l’analyse de votre code, rendant ainsi votre développement PHP plus efficace et intuitif.

Cas d'utilisation avancée : le débogage à distance avec Xdebug

Cette fonctionnalité permet d'analyser et d'exécuter pas à pas un script PHP s'exécutant sur un serveur distant, tout en utilisant un IDE local comme PHPStorm ou VS Code. Vous pouvez débugger du code distant directement depuis votre machine !

C'est une fonctionnalité essentielle pour les développeurs travaillant sur des environnements de développement en conteneurs, des machines virtuelles ou des serveurs distants.

> Quels avantages à utiliser le débogage à distance ?

Cette fonctionnalité vous permet de :

  • Déboguer un environnement qui ne peut pas exécuter un IDE (serveurs distants, conteneurs Docker, machines virtuelles).
  • Tester un code en conditions réelles, sur un environnement proche de la production.
  • Éviter les var_dump() et die() dans le code, en inspectant les variables et la pile d'exécution directement dans l'IDE.

> Configuration de Xdebug pour le débogage à distance

Pour activer le débogage à distance, ajoutez ou modifiez les paramètres suivants dans le fichier php.ini sur le serveur distant :

xdebug.mode=debug
xdebug.start_with_request=yes
xdebug.client_host= {IP_PUBLIQUE_INSTANCE_DEPUIS_LAQUELLE_DEBUGGER}
xdebug.client_port=9003

Un point important à prendre en compte est le fait que le serveur distant doit pouvoir contacter l’IDE. Il ne peut pas envoyer les informations à une IP locale (i.e. IP en 192.168.x.x ou 127.0.0.1). Plusieurs solutions s'offrent à vous pour configurer le paramètre xdebug.client_host :

  • Rediriger un port sur votre routeur et utiliser votre IP publique (xclient_host={MON_IP_PUBLIQUE}).
  • Utiliser un VPN pour connecter le serveur distant et l’ordinateur local, puis renseigner l'IP privée fournie par le VPN (xclient_host={MON_IP_VPN}).
  • Si Xdebug fonctionne dans Docker sur votre machine locale, utilisez la valeur host.docker.internal (xdebug.client_host=host.docker.internal).

Le débogage à distance avec Xdebug est un outil puissant qui simplifie l’analyse des problèmes sur des serveurs ou des environnements isolés. Une bonne configuration permet d'inspecter et de corriger les bugs sans ajouter de logs ou d’instructions temporaires dans le code.

Bonnes pratiques et optimisation des performances de Xdebug

Nous l’avons vu, un débogage efficace passe avant tout par une instance de Xdebug bien configurée. En effet, son activation peut impacter les performances, c’est donc quelque chose à prendre en compte, surtout en environnement de production.

Voici quelques recommandations pour tirer le meilleur parti d’Xdebug sans compromettre l’efficacité de votre application.

Utiliser Xdebug exclusivement en environnement de développement

Cela peut sembler évident, mais Xdebug est pensé pour assister le développement et être utilisé préférentiellement pendant cette phase. En toute rigueur, du code doit avoir été testé et débuggé avant d’être déployé en production. L’utilisation systématique de l’outil sur un environnement de production n’a donc pas lieu d’être.

Par conséquent, activez Xdebug uniquement sur vos environnements de test ou de développement et désactivez-le en production pour éviter tout ralentissement des requêtes PHP. Pour cela, utilisez la configuration suivante dans votre fichier php.ini de production :

; Désactivation de Xdebug en production
zend_extension=xdebug.so
xdebug.mode=off

Limiter l'utilisation du profilage

Le profilage fournit des informations détaillées sur l'exécution de votre code, mais il peut générer de nombreux fichiers et alourdir le système. Pour une gestion optimale :

  • Désactivez le profilage de manière globale dans votre configuration :
    ; Profilage désactivé par défaut
    xdebug.mode=off
  • Activez-le ponctuellement au niveau des scripts nécessitant une analyse précise :
    // Activation du profilage uniquement pour ce script php
    ini_set('Xdebug.mode', 'profile');

Ainsi, vous limitez la collecte excessive de données tout en ciblant précisément les zones à analyser.

Désactiver les fonctionnalités non essentielles

Encore un conseil qui peut sembler évident mais qui a son importance. Xdebug propose plusieurs modes tels que debug, develop, trace ou profile. Activez uniquement ceux dont vous avez réellement besoin.

Par exemple, si vous ne souhaitez utiliser que le débogage sans profilage, utilisez la configuration suivante dans votre fichier php.ini :
; Activation exclusive du mode débogage
xdebug.mode=debug
xdebug.profiler_enable=0

Cette approche réduit l’empreinte mémoire et améliore la réactivité de vos applications.

Mettre à jour régulièrement Xdebug

Les versions récentes intègrent souvent des optimisations de performance et des corrections de bugs. Veillez donc à maintenir Xdebug à jour pour bénéficier des dernières améliorations et limiter son impact sur vos systèmes.

En suivant ces bonnes pratiques, vous optimisez l'utilisation de Xdebug et préservez les performances de vos applications tout en profitant de ses puissantes fonctionnalités de débogage et de profilage.

Comparaison avec d'autres outils

Xdebug est souvent la référence grâce à ses fonctionnalités avancées (points d’arrêt, inspections de variables, profilage détaillé), mais il n’est pas toujours la solution la plus adaptée à tous les contextes. Selon vos besoins, d'autres outils peuvent offrir un meilleur compromis entre performance, ergonomie et intégration.

Quels sont les critères à prendre en compte pour trouver la meilleure solution ?

Avant de porter son choix sur Xdebug, il convient de passer en revue les critères suivants :

  • L’impact sur les performances : Xdebug peut ralentir l’exécution des scripts, notamment en environnement de production. Pour des besoins de monitoring léger, il est judicieux de se tourner vers des alternatives plus performantes.
  • Les cas d’usage spécifiques : certains outils répondent à des besoins précis, comme le débogage en ligne de commande ou le profilage allégé, ce qui permet d’optimiser l’analyse sans imposer une surcharge inutile.
  • L’intégration avec l’écosystème : selon le framework ou le CMS utilisé (Symfony, Laravel, Drupal, etc.), des outils natifs ou complémentaires peuvent s’intégrer de manière plus fluide à votre environnement de développement.

Quand privilégier une alternative à Xdebug ?

Dans les cas suivants, une alternative à Xdebug peut se montrer préférable :

  • Environnement de production : pour limiter l’impact sur les performances tout en continuant à profiler votre application, privilégiez des solutions comme Blackfire ou Tideways. Ces outils offrent un profilage léger et sécurisé, adapté aux environnements de production.
  • Débogage en CLI ou directement sur serveurs distants : pour un débogage interactif sans interface graphique, phpdbg est une excellente alternative. Par exemple, vous pouvez lancer :
    phpdbg -e your_script.php
    Cette interface vous permet d’exécuter des commandes interactives telles que run, break ou step.
  • Applications Drupal : dans l’écosystème Drupal, le module Devel est largement utilisé pour le débogage. Il peut être associé au module WebProfiler, qui fournit une barre d'outils similaire à celle de Symfony pour afficher des informations détaillées sur les requêtes, la consommation mémoire, les logs et les performances des requêtes SQL.
    Pour des analyses plus poussées, Xdebug peut être utilisé en environnement de développement, tandis que Blackfire est recommandé pour le profilage en production.
  • Applications Symfony/Laravel : pour un débogage rapide et visuel dans vos applications Web, des outils comme Symfony VarDumper (via la fonction dump()) ou PHP Debug Bar facilitent l’inspection des variables, l’analyse des logs, des requêtes SQL et du temps d’exécution.
  • Équipes full-stack : si vous travaillez sur des projets combinant plusieurs langages (PHP, JavaScript, etc.), Ray offre une vue unifiée et des fonctionnalités avancées comme ray()->pause() pour inspecter des variables sans modifier votre code.

En résumé, Xdebug reste incontournable pour le débogage complexe et le profilage détaillé en phase de développement. Toutefois, selon vos exigences, vous pouvez envisager d’autres outils. L’approche optimale consiste souvent à combiner Xdebug en développement local avec des outils complémentaires adaptés aux phases de test et de monitoring, afin d’assurer une performance optimale tout au long du cycle de vie de votre application.
En adoptant ces bonnes pratiques, vous garantissez une amélioration notable de vos performances et une expérience de développement plus fluide et proactive.

Crédit photo : Deagreez

Image mise en avant pour l'article
Alban Guerbette
Développeur Drupal • Pôle CMS & Front
Vous avez un projet digital à nous confier ?
Notre équipe d'experts vous conseille et accompagne dans votre projet.
Contactez-nous !