<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Artisan Numérique</title>
  <link rel="alternate" type="text/html" href="http://artisan.karma-lab.net/node/1670"/>
  <link rel="self" type="application/atom+xml" href="http://artisan.karma-lab.net/node/1670/atom/feed"/>
  <id>http://artisan.karma-lab.net/node/1670/atom/feed</id>
  <updated>2008-12-19T17:10:33+01:00</updated>
  <entry>
    <title>Débugger et profiler une application PHP</title>
    <link rel="alternate" type="text/html" href="http://artisan.karma-lab.net/node/1670" />
    <id>http://artisan.karma-lab.net/node/1670</id>
    <published>2008-12-19T17:10:33+01:00</published>
    <updated>2008-12-19T17:10:33+01:00</updated>
    <author>
      <name>Ulhume</name>
    </author>
    <category term="PHP" />
    <category term="drupalfr.org" />
    <category term="OK" />
    <category term="Planet Libre" />
    <category term="Tutoriel" />
    <summary type="html"><![CDATA[<p>
   Debugger une application PHP se résume souvent à coller des <kbd>error_log</kbd> un peu partout dans le code. Mais lorsque le dit code commence à passer une taille critique, cette option devient vite ingérable. C'est là qu'intervient <a class='external' target='_blank' href='http://www.xdebug.org/' >Xdebug</a>, le concurrent libre du debugger de Zend. 
</p>
    ]]></summary>
    <content type="html"><![CDATA[<p>
   Debugger une application PHP se résume souvent à coller des <kbd>error_log</kbd> un peu partout dans le code. Mais lorsque le dit code commence à passer une taille critique, cette option devient vite ingérable. C'est là qu'intervient <a class='external' target='_blank' href='http://www.xdebug.org/' >Xdebug</a>, le concurrent libre du debugger de Zend. 
</p>
<!--break-->

	<a name='chapter_1'></a>
  <h2>Eclipse/PDT et Apache/PHP/XDebug</h2>
	
<p>
  Pour traquer les cafards, nous allons tout d'abord utiliser <a class='external' target='_blank' href='http://www.eclipse.org/' >Eclipse</a> (3.4 aka Ganymede) et l'excellent plugin <a class='external' target='_blank' href='/node/1262' >PDT</a> (2.x dev). 
</p>
<p>
  Une fois le plugin en place, il reste à ajouter Xdebug à la votre <a class='external' target='_blank' href='/node/1055' >plate-forme de test</a>. Je pars du principe qu'Apache et PHP sont déjà installés et que le serveur est en écoute quelque part sur le réseau. 
</p>


	<a name='chapter_2'></a>
  <h2>Paramétrage du serveur</h2>
	
<p>
  Installer XDebug n'est pas bien compliqué, il y a de très fortes chances qu'il soit déjà inclus dans votre distribution. Sous Mandriva, cela passe donc simplement par un <kbd>urpmi php-xdebug</kbd>. Sur les debian-like j'imagine qu'un coup d'<kbd>apt-get</kbd> ne doit pas tomber très loin. 
</p>
<p>
  Une fois le paquet en place, reste à configurer PHP pour qu'il utilise cette nouvelle extension. Toujours sous Mandriva, cela se passe dans le fichier <kbd>/etc/php.d/A29_xdebug.ini</kbd>. Là nous allons rechercher une série de variables suivantes à modifier :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  xdebug.remote_autostart <span class="sy0">=</span><span class="re2"> Off</span><br />
xdebug.remote_enable <span class="sy0">=</span><span class="re2"> On</span><br />
xdebug.remote_host <span class="sy0">=</span><span class="re2"> <span class="nu0">10.0</span><span class="nu0">.0</span><span class="nu0">.10</span></span><br />
xdebug.remote_port <span class="sy0">=</span><span class="re2"> <span class="nu0">9000</span></span><br />
xdebug.remote_handler <span class="sy0">=</span> <span class="st0">&quot;dbgp&quot;</span>
  </div>
  
  </div>
</p>
<p>
  Le principe de XDebug est un peu troublant au démarrage. Lorsqu'éclipse lance le debuggage d'une page, il ouvre au préalable un serveur XDebug sur le port 9000. Lorsqu'Apache affiche la page, le plugin php-xdebug prend la main et cherche à se connecter sur ce serveur. c'est la que le debuggage commence. Du coup, il est nécessaire de spécifier dans <kbd>A29_xdebug.ini</kbd> l'adresse IP de la machine sur laquelle tourne eclipse, ici nous avons <kbd>10.0.0.10</kbd>, à remplacer donc par la votre. Si vous travaillez uniquement en local, vous pouvez remplacer cela par <kbd>localhost</kbd>.
</p>

<div class='inline-box note'>
Je n'ai pas noté de perte significative de performance en laissant ces options ainsi même lorsque l'on ne debugge pas le code. Peut-être d'autres ont une expérience différente ?
</div>

<p>
  Maintenant, juste un petit coup de redémarrage d'apache et nous pouvons retourner sous Eclipse. 
</p>


	<a name='chapter_3'></a>
  <h2>Paramétrage d'eclipse</h2>
	
<p>
  Là encore, quelques réglages sont nécessaires. Déjà il nous faut configurer un navigateur par défaut. Pour cela, faite un tour dans <kbd>Windows</kbd>/<kbd>Préférences</kbd> (me demandé pas pourquoi ils ont clocké ça là dedans...), <kbd>General</kbd>/<kbd>Web Browser</kbd>. Là vous ajouterez votre navigateur préféré en prendrez soin de le cocher une fois l'opération réalisée pour le rendre actif par défaut. 
</p>
<p>
  Ne partez pas tout de suite, et allez dans la section <kbd>PHP</kbd>/<kbd>Debug</kbd>. Là vous pouvez sélectionner <kbd>xdebug</kbd> et clicker sur <kbd>Configure</kbd>, histoire de vérifier que le host est bien <kbd>localhost</kbd> et le port <kbd>9000</kbd>, comme nous l'avions configuré pour PHP.
</p>
<p>
  Voilà, vous pouvez clicker sur <kbd>OK</kbd> pour valider ce paramétrage.</p>
<p> 
  Maintenant, il ne nous reste plus qu'à lancer l'application en mode déverminage par <kbd>Run</kbd>/<kbd>Debug As</kbd>/<kbd>PHP Web Page</kbd>. Comme c'est un nouveau lancement, on vous demande une URL qui est généralement fausse. Remplacez cela par celle de la page à tester. Une fois validée, le navigateur s'ouvre et l'exécution s'arrête brutalement sur le première ligne du premier script PHP. Après c'est du classique, vous avez accès au pas à pas (F6), aux points d'arrêt, à la visualisation des variables par survol, l'ajout d'expressions <kbd>watch</kbd>, etc...
</p>



	<a name='chapter_4'></a>
  <h2>Analyse de performances</h2>
	
<p>
  L'intérêt de <kbd>Xdebug</kbd> ne s'arrête pas au debuggage, loin de là. C'est aussi un formidable outil d'analyse de performance (profiling). Pour activer ce mode, il faut retourner dans le fichier de configuration de <kbd>Xdebug</kbd> pour modifier comme suit :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  xdebug.profiler_append <span class="sy0">=</span><span class="re2"> Off</span><br />
xdebug.profiler_enable <span class="sy0">=</span><span class="re2"> On</span><br />
xdebug.profiler_enable_trigger <span class="sy0">=</span><span class="re2"> Off</span><br />
xdebug.profiler_output_dir <span class="sy0">=</span><span class="re2"> /tmp</span><br />
xdebug.profiler_output_name <span class="sy0">=</span><span class="re2"> php_profile.txt</span>
  </div>
  
  </div>
</p>
<p>
<image file="kcachegrind.png"/>
  Attention, cette fois il est très claire qu'activer cela nuit gravement aux performances. Activez et désactivez donc <kbd>xdebug.profiler_enable</kbd> selon vos besoins. 
</p>

<p>
  Une fois le serveur Apache redémarré, il ne vous reste plus qu'à aller faire un tour sur la page qui explose les compteurs de temps. Quant vous avez terminé, retournez voir dans le dossier <kbd>/tmp</kbd> où devrait se trouver un <kbd>php_profile.txt</kbd>, c'est lui qui contient tous les temps d'exécution enregistrés par <kbd>Xdebug</kbd>.
</p>
<p>
  Pour visualiser le résultat, malheureusement il n'existe pas (à ma connaissance) d'application GTK. Mais il y a néanmoins le très bon <kbd>kcachegrind</kbd> qui permet une exploration précise et rapide des temps d'exécutions. 
</p>



	<a name='chapter_5'></a>
  <h2>Conclusion</h2>
	
<p>
  <kbd>Xdebug</kbd> fait à mon sens parti de la trousse à outil de base lorsque l'on porte sa casquette de développeur (ou pompier <img src="http://artisan.karma-lab.net/sites/all/modules/contrib/smileys/packs/crystal/wink2.gif" title="Wink" alt="Wink" class="smiley-content"/> PHP. Il n'empêche pas de coller nos <kbd>error_log</kbd> de base mais aide énormément lorsque l'application patine ou qu'un algo part en vrille. 
</p>

    ]]></content>
  </entry>
</feed>
