<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://blog.phppro.fr/?feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
  <title>PHPPRO - Outillage</title>
  <link>http://blog.phppro.fr/?</link>
  <atom:link href="http://blog.phppro.fr/?feed/category/Outillage/rss2" rel="self" type="application/rss+xml"/>
  <description>PHP Professionnel pour les entreprises</description>
  <language>fr</language>
  <pubDate>Sun, 19 May 2013 21:26:13 +0200</pubDate>
  <copyright>Copyright PHPPRO 2011</copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Fonctionnalité PM du jour : commencer à utiliser PM sur un projet existant</title>
    <link>http://blog.phppro.fr/?post/2011/04/19/Fonctionnalite-PM-du-jour-%3A-commencer-a-utiliser-PM-sur-un-autre-existant</link>
    <guid isPermaLink="false">urn:md5:8e63e7ff9997682fce0b48707eda530a</guid>
    <pubDate>Tue, 19 Apr 2011 18:42:00 +0100</pubDate>
    <dc:creator>Olivier Hoareau</dc:creator>
        <category>Outillage</category>
        <category>5.3</category><category>linux</category><category>php</category><category>pm</category><category>windows</category>    
    <description>&lt;p&gt;Vous travaillez déjà sur un projet de développement. Vous avez entendu parler (ou pas) d'un outil en ligne de commande qui s'appellerai PM et qui aurait certaines fonctionnalités obscures... Vous avez envie de le tester mais vous ne savez pas comment vous y prendre, ce billet est fait pour vous...&lt;/p&gt;    &lt;p&gt;Pour rappel, PM est mon outil en ligne de commande pour &quot;augmenter la productivité d'équipe&quot;, vous trouverez des informations, le code source et la dernière version (0.1.3.4 à l'heure ou j'écris ces lignes) sur le site officiel&amp;nbsp;: &lt;a href=&quot;http://github.com/phppro/pm&quot;&gt;http://github.com/phppro/pm&lt;/a&gt;.&lt;/p&gt;


&lt;h2&gt;Première étape&amp;nbsp;: disposez d'un projet existant&lt;/h2&gt;


&lt;p&gt;Commencez par choisir un projet (code source) sur lequel vous travaillez déjà (ou avez déjà travaillé).
Mettez le dans un répertoire sur votre disque local, disons $HOME/dev/ze-project (ou $HOME est /home/&amp;lt;login&amp;gt; sous linux, et C:\Users\&amp;lt;login&amp;gt; ou C:\Documents and Settings\&amp;lt;login&amp;gt; sous windows XP et supérieure).&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Vous êtes prêt ?&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;Deuxième étape&amp;nbsp;: télécharger pm.phar&lt;/h2&gt;


&lt;p&gt;L'outil PM est empaqueté sous la forme d'un fichier unique &lt;strong&gt;pm.phar&lt;/strong&gt; qu'il faut télécharger à l'adresse&amp;nbsp;: &lt;a href=&quot;http://github.com/downloads/phppro/pm/pm.phar&quot;&gt;http://github.com/downloads/phppro/pm/pm.phar&lt;/a&gt; (attention, votre navigateur pourrais modifier le contenu du .phar en le téléchargeant, pour ne pas avoir de problème accédez via votre navigateur à &lt;a href=&quot;http://github.com/phppro/pm&quot;&gt;http://github.com/phppro/pm&lt;/a&gt;, cliquez sur le bouton Download/Télécharger à droite de l'écran et cliquez-droit sur pm.phar, et enregistrer la cible sur le disque dur.&lt;/p&gt;


&lt;p&gt;Une fois téléchargé, copiez/déplacer pm.phar dans le répertoire $HOME/dev/ze-project/pm.phar&lt;/p&gt;


&lt;h2&gt;Troisième étape&amp;nbsp;: installer PHP 5.3 (si il n'est pas encore installé sur votre système)&lt;/h2&gt;


&lt;p&gt;Bien qu'il puisse &quot;gérer&quot; des projets utilisants n'importe laquelle des versions de PHP (même PHP 4 !), PM nécessite lui-même PHP 5.3 ou supérieure (version CLI / Ligne de Commande) pour fonctionner.
Pour vérifier que vous avez une version suffisante de PHP installée&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ouvrez une console / shell et exécutez&amp;nbsp;:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;
$ php -v

PHP 5.3.5 (cli) (built: Jan  5 2011 20:29:28)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
    with Xdebug v2.1.0, Copyright (c) 2002-2010, by Derick Rethans
&lt;/pre&gt;


&lt;p&gt;Si vous avez une version inférieure à 5.3.0, alors vous ne pourrez pas utiliser PM avec cette version de PHP.
Si c'est le cas, pas de panique, il vous suffit juste d'installer une version complémentaire de PHP sur votre système.
Bien sûr, vous pouvez décider de mettre à jour votre version actuelle de PHP pour utiliser une version &amp;gt;= 5.3.0, cependant vérifier bien avant que toutes vos applications locales et tous les développements sur lesquelles vous travaillez sont compatibles avec cette nouvelle version majeure.&lt;/p&gt;


&lt;h3&gt;Installer une version supplémentaire de PHP 5.3 sur votre poste&lt;/h3&gt;


&lt;p&gt;Suivant que vous soyez sur Windows ou Linux, la méthode pour installer une version complémentaire de PHP sera différente.&lt;/p&gt;


&lt;h4&gt;Vous êtes sous Windows&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Téléchargez la dernière version de PHP 5.3.x sur le site officiel, en choisissant le &lt;strong&gt;paquet binaire windows en version zippée&lt;/strong&gt; (quelque chose &lt;strong&gt;php-5.3.6-nts-Win32-VC9-x86.zip&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;Dézippez le paquet téléchargé n'importe où sur votre disque dur, par exemple dans C:\Program Files\PHP-5.3, de sorte que vous ayez C:\Program Files\PHP-5.3\php.exe&lt;/li&gt;
&lt;li&gt;Créez le fichier C:\Windows\php-5.3.bat avec le contenu suivant&amp;nbsp;:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;
@echo off
&amp;quot;C:\Program Files\PHP-5.3\php.exe&amp;quot; -c &amp;quot;C:\Program Files\PHP-5.3\php.ini-development&amp;quot; %*
&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;ouvrez une ligne de commande windows, exécutez&amp;nbsp;:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;
$ php-5.3 -v

PHP 5.3.6 (cli) (built: Mar 17 2011 10:48:37)
Copyright (c) 1997-2011 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies
&lt;/pre&gt;


&lt;h4&gt;Vous êtes sous Linux&lt;/h4&gt;


&lt;p&gt;Avec la grande majorité des distributions, il est recommandé d'installer vos logiciels avec un système d'installation de paquets, tel que aptitude / apt / yum / rpm / ...
Un des problèmes récurrents avec l'utilisations de ces outils est qu'il est difficile (certains pourront peut être nous conseiller la dessus ;)) d'installer plusieurs versions d'un logiciel en même temps sur le même système.
A moins que vous ayez trouvé une solution spécifique à votre distribution, je vous propose donc de passer par la case compilation (désolé ;))&amp;nbsp;:&lt;/p&gt;


&lt;p&gt;Je propose &lt;a href=&quot;http://blog.phppro.fr/?post/2011/04/19/Compiler-PHP-53x-sous-linux&quot;&gt;une méthode de compilation de PHP en ligne de commande basique pour Ubuntu 10.04 LTS 64 bits&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;L'important est d'arriver à avoir un exécutable php (quelque soit sont chemin et son nom) qui peut utiliser son propre php.ini et ses propres extensions .so (si besoin) sans &quot;toucher&quot; à votre installer actuelle de PHP.&lt;/p&gt;


&lt;h2&gt;Quatrième étape: exécuter PM pour la première fois&lt;/h2&gt;


&lt;p&gt;Ca y est, vous avez PHP 5.3+ installé/disponible sur votre machine et accessible par la commande &lt;strong&gt;php-5.3&lt;/strong&gt; (ou bien &lt;strong&gt;php&lt;/strong&gt; !)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;reouvrez une console / shell&lt;/li&gt;
&lt;li&gt;rendez-vous depuis la console dans le répertoire $HOME/dev/ze-project, puis exécutez la ligne suivante et répondez aux questions posées&amp;nbsp;:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;
$ php-5.3 pm.phar

PM v0.1.3.4 par PHPPRO http://github.com/phppro/pm

Voulez-vous activer le support de PM pour votre projet (Y,n) [Y] : Y

Vous n'avez pas encore defini vos parametres projet, voulez-vous les definir maintenant (Y,n) [Y] : Y
Quelle est la langue d'affichage par defaut pour tous les membres de l'equipe (&amp;lt;auto&amp;gt;,en-us,fr-fr) [&amp;lt;auto&amp;gt;] : fr-fr
Quel est le nom de code (minuscules, sans accent, sans espace) du projet [ze-project] : ze-project
Quelle est le nom de l'entreprise / l'organisation proprietaire de ce projet : PHPPRO
Quelle est l'adresse du site internet de 'PHPPRO' [http://www.phppro.com] : http://www.phppro.fr

Merci ! le projet s'appelle maintenant &amp;quot;ze-project&amp;quot;.
Vous pourrez mettre a jour a tout moment les preferences du projet dans le fichier _pm/project.ini ou project.php (les deux sont fusionnes)

Vous n'avez pas encore defini vos parametres utilisateur, voulez-vous les definir maintenant (Y,n) [Y] : Y
Quelle est votre langue d'affichage preferee (&amp;lt;auto&amp;gt;,en-us,fr-fr) [&amp;lt;auto&amp;gt;] : fr-fr
Quel est votre nom [ohoareau] : Olivier Hoareau
Quelle est votre adresse email : me@email.com

Merci ! vous serez maintenant identifie &amp;quot;ohoareau&amp;quot; sur ce projet.
Vous pourrez mettre a jour a tout moment vos preferences dans le fichier _pm/users/ohoareau.ini

Pour afficher l'aide : &amp;quot;pm -h [&amp;lt;action|prefixe&amp;gt;]&amp;quot;
Un bug ? une fonctionnalite ? http://github.com/phppro/pm, merci !
&lt;/pre&gt;


&lt;p&gt;Ca y est&amp;nbsp;! le support de PM est activé pour votre projet&amp;nbsp;!&lt;/p&gt;


&lt;p&gt;Il vous faudra ensuite éventuellement modifier le contenu des fichiers pm (linux) ou pm.bat (windows) pour remplacer &quot;php&quot; par le nom de l'exécutable (chemin complet ou nom spécifique) PHP à utiliser pour exécuter la version PHP 5.3+.&lt;/p&gt;


&lt;p&gt;Vous devriez maintenant pouvoir exécuter PM directement avec la commande &lt;strong&gt;pm&lt;/strong&gt;.&lt;/p&gt;


&lt;p&gt;Enfin presque, si vous êtes sous linux, il vous faudra utiliser &lt;strong&gt;./pm&lt;/strong&gt; après avoir fait&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
$ chmod u+x ./pm
&lt;/pre&gt;

&lt;pre&gt;
$ pm

PM v0.1.3.4 par PHPPRO http://github.com/phppro/pm

Pour afficher l'aide : &amp;quot;pm -h [&amp;lt;action|prefixe&amp;gt;]&amp;quot;
Un bug ? une fonctionnalite ? http://github.com/phppro/pm, merci !
&lt;/pre&gt;


&lt;h2&gt;Cinquième étape: afficher la liste des commandes&lt;/h2&gt;


&lt;p&gt;Pour afficher la liste des commandes PM disponibles (certaines sont activées en fonction des fichiers contenus dans votre projet et des outils que vous utilisez, comme svn et phpunit par exemple), exécutez depuis la racine de votre projet&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
$ pm -h

PM v0.1.3.4 par PHPPRO http://github.com/phppro/pm

Syntaxe : pm [&amp;lt;options-communes&amp;gt;] &amp;lt;action&amp;gt; [arg1] [arg2] [...] [options]

Listes des options communes disponibles :

 -d &amp;lt;cle&amp;gt;=&amp;lt;valeur&amp;gt;        modifie une directive INI de PHP
 -h [&amp;lt;action&amp;gt;|&amp;lt;prefixe&amp;gt;]  affiche cette aide ou l'aide de l'action specifiee
 -l=&amp;lt;langue&amp;gt;              modifie la langue d'affichage (en-us*, fr-fr, ...)
 -o                       active le mode debug
 -s                       liste tous les pre-reglages charges
 -v                       affiche la version de PM
 -i                       active le mode interactif
 -u                       mets a jour a la derniere version de PM

Liste des actions disponibles :

 new      cree une nouvelle action/commande personnalisee

 pkg      cree un paquet contenant le code source du projet (format par defaut: phar)
 publish  publie le code source du projet ou le paquet specifie sur la cible distante specifiee

 tpl      utilise un modele pour generer une arborescence de fichiers
 tpl:new  cree un nouveau modele d'arborescence vide


Pour afficher l'aide : &amp;quot;pm -h [&amp;lt;action|prefixe&amp;gt;]&amp;quot;

Un bug ? une fonctionnalite ? http://github.com/phppro/pm, merci !
&lt;/pre&gt;


&lt;p&gt;La liste des commandes qui s'affichent pour vous peut être légèrement différente car PM tente de détecter la présence de certains fichiers dans votre projet (.project par exemple ou .svn) ou bien la présence de certains exécutables dans le PATH système (comme phpunit) pour vous ajouter éventuellement des commandes supplémentaires.&lt;/p&gt;


&lt;p&gt;Vous pouvez maintenant commencer à utiliser pleinement PM&amp;nbsp;!&lt;/p&gt;


&lt;p&gt;Je vous invite à parcourir le document de présentation de PM accessible sur &lt;a href=&quot;http://blog.phppro.fr/?post/2011/04/13/PM-%3A-Developpeurs-augmentez-votre-productivite&quot;&gt;SlideShare&lt;/a&gt;, vous pourrez notamment y découvrir les principales commandes, que je décrirais prochainement sur le blog.&lt;/p&gt;


&lt;p&gt;Alors, tout s'est bien passé&amp;nbsp;? ;)&lt;/p&gt;


&lt;p&gt;Vos idées / remarques / critiques sont bien entendus les bienvenus directement sur &lt;a href=&quot;http://github.com/phppro/pm/issues&quot;&gt;http://github.com/phppro/pm/issues&lt;/a&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.phppro.fr/?post/2011/04/19/Fonctionnalite-PM-du-jour-%3A-commencer-a-utiliser-PM-sur-un-autre-existant#comment-form</comments>
      <wfw:comment>http://blog.phppro.fr/?post/2011/04/19/Fonctionnalite-PM-du-jour-%3A-commencer-a-utiliser-PM-sur-un-autre-existant#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.phppro.fr/?feed/atom/comments/91</wfw:commentRss>
      </item>
    
  <item>
    <title>Compiler PHP 5.3.x sous linux</title>
    <link>http://blog.phppro.fr/?post/2011/04/19/Compiler-PHP-53x-sous-linux</link>
    <guid isPermaLink="false">urn:md5:dfdba0e7f9d53f651807ffb80b317a5b</guid>
    <pubDate>Tue, 19 Apr 2011 18:10:00 +0100</pubDate>
    <dc:creator>Olivier Hoareau</dc:creator>
        <category>Outillage</category>
        <category>5.3</category><category>compilation</category><category>linux</category><category>php</category>    
    <description>&lt;p&gt;Pour les besoins d'un futur billet sur ce blog, je décris ici un exemple de méthode de compilation de PHP sous Linux Ubuntu 10.04 LTS (64 Bits).
La méthode reste la même dans les grandes lignes sur l'ensemble des distributions modernes, vous aurez peut être à personnaliser quelques dépendances de paquets par ci par là.&lt;/p&gt;    &lt;p&gt;(Attention: l'opération &quot;make&quot; peut prendre plusieurs minutes à plusieurs dizaines de minutes en fonction de la capacité de votre machine)&lt;/p&gt;

&lt;pre&gt;
$ cd ~
$ mkdir test-compilation
$ cd test-compilation
$ wget 'http://fr.php.net/distributions/php-5.3.6.tar.bz2'
$ tar xjvf php-5.3.6.tar.bz2 &amp;gt; /dev/null
$ cd php-5.3.6/
$ sudo apt-get install libc-dev libxml2-dev libmcrypt-dev gcc
$ ./configure --disable-cgi --enable-mbstring --with-mcrypt
$ make clean
$ make
&lt;/pre&gt;


&lt;p&gt;Si aucune erreur de compilation n'est survenue, vous devriez avoir votre exécutable dans&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
sapi/cli/php
&lt;/pre&gt;


&lt;p&gt;Pour tester votre nouvel exécutable&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
$ ./sapi/cli/php -c ./php.ini-development -v

PHP 5.3.6 (cli) (built: Apr 19 2011 18:53:16)
Copyright (c) 1997-2011 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies
&lt;/pre&gt;


&lt;p&gt;Vous pouvez maintenant créer un script shell pour accéder rapidement a votre exécutable&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
$ mkdir -p ~/bin
$ vi ~/bin/php-5.3

#!/bin/sh

~/test-compilation/php-5.3.6/sapi/cli/php -c ~/test-compilation/php-5.3.6/php.ini-development $*

$ chmod u+x ~/bin/php-5.3
$ source ~/.profile
&lt;/pre&gt;


&lt;p&gt;Testez maintenant votre script&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
$ php-5.3 -v


PHP 5.3.6 (cli) (built: Apr 19 2011 18:53:16)
Copyright (c) 1997-2011 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies
&lt;/pre&gt;


&lt;p&gt;Vous pouvez maintenant utiliser votre exécutable *php-5.3* en ligne de commande&lt;/p&gt;


&lt;p&gt;Bien sûr il s'agit d'une procédure minimaliste de compilation de PHP, l'objectif étant d'avoir le strict nécessaire pour avoir PHP exécutable en ligne de commande en version 5.3, sans désinstaller la version actuelle de PHP&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.phppro.fr/?post/2011/04/19/Compiler-PHP-53x-sous-linux#comment-form</comments>
      <wfw:comment>http://blog.phppro.fr/?post/2011/04/19/Compiler-PHP-53x-sous-linux#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.phppro.fr/?feed/atom/comments/90</wfw:commentRss>
      </item>
    
  <item>
    <title>PM : Développeurs, augmentez votre productivité !</title>
    <link>http://blog.phppro.fr/?post/2011/04/13/PM-%3A-Developpeurs-augmentez-votre-productivite</link>
    <guid isPermaLink="false">urn:md5:01378f6d8c68e819db280d2906d2946b</guid>
    <pubDate>Wed, 13 Apr 2011 22:39:00 +0100</pubDate>
    <dc:creator>Olivier Hoareau</dc:creator>
        <category>Outillage</category>
        <category>php 5.3</category><category>pm</category><category>équipe</category>    
    <description>Ce soir, lors de la première séance du PHP User Group Bordeaux,  j'ai présenté mon nouvel outil en ligne de commande pour augmenter la productivité au quotidien : PM.
Voici la slides de ma présentation, vos commentaires sont les bienvenus !    &lt;div style=&quot;width:425px&quot; id=&quot;__ss_7619513&quot;&gt; &lt;strong style=&quot;display:block;margin:12px 0 4px&quot;&gt;&lt;a href=&quot;http://www.slideshare.net/ohoareau/pm-code-faster&quot; title=&quot;PM : code faster&quot;&gt;PM : code faster&lt;/a&gt;&lt;/strong&gt; &lt;iframe src=&quot;http://www.slideshare.net/slideshow/embed_code/7619513&quot; width=&quot;425&quot; height=&quot;355&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot;&gt;&lt;/iframe&gt; &lt;div style=&quot;padding:5px 0 12px&quot;&gt; View more &lt;a href=&quot;http://www.slideshare.net/&quot;&gt;presentations&lt;/a&gt; from &lt;a href=&quot;http://www.slideshare.net/ohoareau&quot;&gt;PHPPRO&lt;/a&gt; &lt;/div&gt; &lt;/div&gt;</description>
    
    
    
          <comments>http://blog.phppro.fr/?post/2011/04/13/PM-%3A-Developpeurs-augmentez-votre-productivite#comment-form</comments>
      <wfw:comment>http://blog.phppro.fr/?post/2011/04/13/PM-%3A-Developpeurs-augmentez-votre-productivite#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.phppro.fr/?feed/atom/comments/89</wfw:commentRss>
      </item>
    
  <item>
    <title>Complémentarité PHPUnderControl / Phing</title>
    <link>http://blog.phppro.fr/?post/2010/02/28/Complementarite-PHPUnderControl-/-Phing</link>
    <guid isPermaLink="false">urn:md5:82db8ddc0fbc85a59cda2bb5bb33d736</guid>
    <pubDate>Sun, 28 Feb 2010 22:56:00 +0000</pubDate>
    <dc:creator>Olivier Hoareau</dc:creator>
        <category>Outillage</category>
        <category>ant</category><category>cruisecontrol</category><category>java</category><category>phing</category><category>php</category><category>phpundercontrol</category><category>phpunit</category>    
    <description>&lt;p&gt;Suite à une demande d'un internaute, j'explique la complémentarité entre PHPUnderControl et Phing&lt;/p&gt;    &lt;h2&gt;PHPUnderControl&lt;/h2&gt;


&lt;p&gt;PHPUnderControl est un version adaptée pour PHP de l'outil open source CruiseControl qui est un logiciel serveur d'intégration continue développé en Java et initiallement pour la technologie Java (i.e. pour gérer des projets écrit en Java).&lt;br /&gt;
L'adaptation de PHPUnderControl consiste en la mise à disposition d'une IHM un peu plus contextualisée pour PHP avec des graphiques de métriques qualité récupérés depuis les outils disponibles avec PHP (phpunit notamment).&lt;/p&gt;


&lt;p&gt;Le principe de ce type de logiciel est de détecter des modifications dans un dépôt de code distant (par exemple un serveur Subversion - SVN) et de déclencher une commande suite à cette détection de modification. Il s'agit donc d'un espèce de méga-ordonnanceur qui est bête et méchant et ne sait finalement que &quot;déclencher&quot; des commandes sur des &quot;stimuli&quot; prédéfinis (i.e. la détection d'un commit sur SVN).&lt;/p&gt;


&lt;h2&gt;Phing&lt;/h2&gt;


&lt;p&gt;Phing est un port du logiciel Ant qui provient du monde Java. Ant est un outil pour écrire des scripts batchs en XML, les rendant ainsi multi-plateformes. Il n'est plus nécessaire de se soucier du format .bat de windows ou .sh des linux-like, les commandes sont écrites en XML&amp;nbsp;: on dispose par exemple de balises mkdir, copy, tar... et il est possible de créer ses propres balises de commande (task) voir ses propres séquences de commandes (target).&lt;br /&gt;
Phing est l'implémentation full-PHP de Ant, c'est à dire qu'il suit le même principe, met à disposition globalement les mêmes commandes selon la même syntaxe, mais l'implémentation est réalisée en PHP et est extensible en PHP. Il se base sur l'écriture d'un fichier de commandes nommés build.xml qu'il est coutume de mettre à la racine de votre projet (à subversionner) et qui doit contenir l'ensemble des commandes dont vous avez besoin pour gérer le code de votre projet (lancer les tests, packager le code, déployer le code, qualifier le code...)&lt;/p&gt;


&lt;h2&gt;PHPUnderControl + Phing et non PHPUnderControl = Phing&lt;/h2&gt;


&lt;p&gt;Phing est donc un moyen de décrire la ou les commandes à exécuter suite à un stimuli détecter par PHPUnderControl.
PHPUnderControl est &quot;compatible&quot; phing en standard ce qui permet de décrire/configurer facilement l'exécution de commande phing dans le fichier de configuration de PHPUnderControl (config.xml). Cependant, même si cette intégration n'existait pas, l'exécution d'une commande phing consiste en faite en l'exécution de la commande shell phing suivi des quelques paramètres, ce qui permet d'intégrer cet outils avec n'importe quel logiciel ordonnanceur, même les tâches planifiées windows.&lt;/p&gt;


&lt;p&gt;PHPUnderControl et Phing sont donc complémentaires mais indépendant et autonomes.&lt;/p&gt;


&lt;p&gt;Bien sûr il est possible de remplacer PHPUnderControl par un autre logiciel du même type (Hudson, Xinc, Continuum, ...), ainsi que Phing (makefile, shell script, script bat, ...)&lt;/p&gt;


&lt;p&gt;Pour obtenir plus de documentation, voici quelques liens&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PHPUnderControl&amp;nbsp;: http://phpundercontrol.sourceforge.net&lt;/li&gt;
&lt;li&gt;Phing&amp;nbsp;: http://phing.info&lt;/li&gt;
&lt;li&gt;CruiseControl&amp;nbsp;: http://www.cruisecontrol.net&lt;/li&gt;
&lt;li&gt;PHPUnit&amp;nbsp;: http://www.phpunit.de&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Avez-vous des questions complémentaires ou des remarques ?&lt;br /&gt;
Et vous, comment utilisez vous PHPUnderControl et Phing&amp;nbsp;? Avez-vous des exemples de build.xml que vous utilisez régulièrement&amp;nbsp;?&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.phppro.fr/?post/2010/02/28/Complementarite-PHPUnderControl-/-Phing#comment-form</comments>
      <wfw:comment>http://blog.phppro.fr/?post/2010/02/28/Complementarite-PHPUnderControl-/-Phing#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.phppro.fr/?feed/atom/comments/77</wfw:commentRss>
      </item>
    
  <item>
    <title>SimpleTest, installation via mon PEAR</title>
    <link>http://blog.phppro.fr/?post/2010/02/25/SimpleTest-installation-via-mon-PEAR</link>
    <guid isPermaLink="false">urn:md5:3b98503606b6231c011184926ac8eb96</guid>
    <pubDate>Thu, 25 Feb 2010 17:18:00 +0000</pubDate>
    <dc:creator>Olivier Hoareau</dc:creator>
        <category>Outillage</category>
        <category>package</category><category>pear</category><category>simpletest</category><category>test unitaire</category>    
    <description>&lt;p&gt;Pour les besoins de l'AFUP, je dois me mettre un peu à SimpleTest (j'ai plus l'habitude sur PHPUnit).
Je n'ai pas trouvé de channel PEAR (a priori) fournissant un package installable via PEAR de SimpleTest et fournissant l'outil en ligne de commande (comme peux le proposer PHPUnit ou d'autres outils). Je vous propose donc celui de mon cru...&lt;/p&gt;    &lt;p&gt;Grâce à un de mes outils de packaging compatible PEAR, j'ai packagé la version 1.0.1 de SimpleTest pour un faire un package PEAR valide et installable via mon channel&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
$ pear channel-discover pear.phppro.fr
$ pear upgrade phppro/simpletest
&lt;/pre&gt;


&lt;p&gt;ou un téléchargement puis une installation locale&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
$ wget http://pear.phppro.fr/get/simpletest-1.0.1.tgz
$ pear upgrade simpletest-1.0.1.tgz
&lt;/pre&gt;


&lt;p&gt;Puis pour l'utilisation&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
$ cd myproject
$ simpletest my_simpletest_test.php
&lt;/pre&gt;


&lt;p&gt;Pour l'implémentation de tests SimpleTest, je vous laisse bien entendu faire un tour sur le site officiel&amp;nbsp;: http://www.simpletest.org&lt;/p&gt;


&lt;p&gt;Dès qu'un channel / package officiel apparaît (ou que quelqu'un m'indique l'adresse) je supprimerai le mien ;)&lt;/p&gt;


&lt;p&gt;Et vous comment faisiez vous pour installer SimpleTest&amp;nbsp;?&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.phppro.fr/?post/2010/02/25/SimpleTest-installation-via-mon-PEAR#comment-form</comments>
      <wfw:comment>http://blog.phppro.fr/?post/2010/02/25/SimpleTest-installation-via-mon-PEAR#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.phppro.fr/?feed/atom/comments/76</wfw:commentRss>
      </item>
    
  <item>
    <title>Capitaliser, Améliorer et Rationnaliser les développements PHP en interne</title>
    <link>http://blog.phppro.fr/?post/2010/02/21/Capitaliser-SAmeliorer-et-Rationnaliser-les-developpements-PHP-en-interne</link>
    <guid isPermaLink="false">urn:md5:6a8b55dc0b9d9e5bb7a2a0c6563ce928</guid>
    <pubDate>Sun, 21 Feb 2010 17:36:00 +0000</pubDate>
    <dc:creator>Olivier Hoareau</dc:creator>
        <category>Outillage</category>
        <category>bonnes pratiques</category><category>intégration continue</category><category>phing</category><category>phpunit</category>    
    <description>Je vous livre ici un document de travail anonymisé sur la présentation d'un outil que je développe pour un client pour cadrer les pratiques de développements, ainsi que les enjeux et la démarche à adopter en interne.    &lt;div style=&quot;width:425px;text-align:left&quot; id=&quot;__ss_3238920&quot;&gt;&lt;a style=&quot;font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;&quot; href=&quot;http://www.slideshare.net/ohoareau/20100221-my-phingtool-blog&quot; title=&quot;20100221   my phingtool - blog&quot;&gt;20100221   my phingtool - blog&lt;/a&gt;&lt;object style=&quot;margin:0&quot; width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=20100221-myphingtool-blog-100221113115-phpapp02&amp;amp;stripped_title=20100221-my-phingtool-blog&quot; /&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot; /&gt;&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot; /&gt;&lt;div style=&quot;font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;&quot;&gt;View more &lt;a style=&quot;text-decoration:underline;&quot; href=&quot;http://www.slideshare.net/&quot;&gt;presentations&lt;/a&gt; from &lt;a style=&quot;text-decoration:underline;&quot; href=&quot;http://www.slideshare.net/ohoareau&quot;&gt;PHPPRO&lt;/a&gt;.&lt;/div&gt;&lt;/object&gt;&lt;/div&gt;</description>
    
    
    
          <comments>http://blog.phppro.fr/?post/2010/02/21/Capitaliser-SAmeliorer-et-Rationnaliser-les-developpements-PHP-en-interne#comment-form</comments>
      <wfw:comment>http://blog.phppro.fr/?post/2010/02/21/Capitaliser-SAmeliorer-et-Rationnaliser-les-developpements-PHP-en-interne#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.phppro.fr/?feed/atom/comments/67</wfw:commentRss>
      </item>
    
  <item>
    <title>Analyse de dépendances classes/fichiers</title>
    <link>http://blog.phppro.fr/?post/2009/10/25/Analyse-de-dependances-classes/fichiers</link>
    <guid isPermaLink="false">urn:md5:8df1db07976ce34ba08356c53b7397a8</guid>
    <pubDate>Sun, 25 Oct 2009 11:48:00 +0000</pubDate>
    <dc:creator>Olivier Hoareau</dc:creator>
        <category>Outillage</category>
        <category>dependance</category><category>métrique</category><category>outils</category><category>pattern</category><category>pear</category><category>php</category><category>require</category>    
    <description>&lt;p&gt;Dans mon précédent post sur &quot;Zend Framework 1.8.3 demystified, Act I&quot;, je vous avais livré un schéma de dépendances entre packages générés grâce à un de mes outils... Je vous livre maintenant l'outils.&lt;/p&gt;    &lt;p&gt;WDependency est un outil réalisé en PHP et utilisant le programme GraphViz/Dot pour générer des graphes de dépendances entre classes , fichiers, projets, packages...&lt;br /&gt;&lt;/p&gt;


&lt;h2&gt;Installation&lt;/h2&gt;

&lt;pre&gt;
pear channel-discover pear.phppro.fr
pear install --alldeps phppro/wdependency
&lt;/pre&gt;


&lt;p&gt;(Un package requis nommé 'WFramework' sera aussi installé, il s'agit d'un framework d'abstraction que je développe avec mes conventions pour illustrer des pratiques / conventions chez mes clients)&lt;/p&gt;


&lt;p&gt;Vérifiez que l'installation c'est bien passée&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
wdependency
&lt;/pre&gt;


&lt;p&gt;(Vous devriez voir l'aide repris ci-dessous)&lt;/p&gt;


&lt;p&gt;Il est ensuite nécessaire d'installer GraphViz/Dot (le binaire 'dot' doit être accessible en ligne de commande)&lt;br /&gt;
Vous pouvez vérifiez si il est installé sur votre poste&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
wdependency :check-dot-support
&lt;/pre&gt;


&lt;p&gt;Si la version de dot ne s'affiche pas, c'est que vous devez l'installer, rendez-vous sur http://www.graphviz.org rubrique downloads, téléchargez et installez l'outil dot.&lt;br /&gt;
Une fois installé, re-vérifiez que wdependency est bien cablé avec dot en relançant un&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
wdependency :check-dot-support
&lt;/pre&gt;


&lt;p&gt;Ensuite pour utiliser l'outil&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
cd my-source-directory
wdependency :help
&lt;/pre&gt;


&lt;p&gt;Vous obtiendrez l'aide de l'outil ci-dessous&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;

 ***** [Syntax] ***************************************************************

   $ wdependency [commands] [options] [&amp;lt;directory&amp;gt;[,&amp;lt;directory&amp;gt;,...]]

 ***** [Available commands] ***************************************************

   use: :&amp;lt;command&amp;gt; , ':' is required

   :help                  display this help
   :instances             computes the instances (use of new operator) dependencies
   :cache                 parses directory content and caches result in all.php for further use
   :clean-cache           cleans existing cache file
   :often-used            top rank node that heavily depend on others
   :classes               computes the classes dependencies (children =&amp;gt; mother)
   :package0-inheritances  computes the classes inheritances reduced to first package level
   :package1              computes the classes dependencies reduced to second package level
   :inheritances          computes the inheritances dependencies
   :includes              computes the includes dependencies
   :packages              computes the packages dependencies
   :dependent-nodes       list all mostly dependent nodes (top ranked)
   :check-dot-support     display the version of dot binary if available (required for dot/picture export)
   :popo                  list Plain Old PHP Objects (no extends / no implements)
   :supers                computes the hierarchy dependency (mother =&amp;gt; children)
   :testcases             list all classes that extends PHPUnit_Framework_TestCase
   :untestedpackages      list all packages that does not contain phpunit test cases
   :testedpackages        list all packages that contains phpunit test cases
   :hubs                  list all classes that are very used by others
   :self-dependent        list all classes that are self-dependent (depend on themself)
   :dependent             list all classes that are dependent to others (more than 4 links to the same)
   :very-dependent        list all classes that are very dependent to others (more than 10 links to the same)
   :extra-dependent       list all classes that are extra dependent to others (more than 20 links to the same)
   :describe-X            display content of specific interface, where X is:
         * listener     for displaying W_Dependency_Listener_Interface
         * exporter     for displaying W_Dependency_Exporter_Interface
         * analyzer     for displaying W_Dependency_Analyzer_Interface
         * filter       for displaying W_Dependency_Filter_Interface
         * aggregator   for displaying W_Dependency_Aggregator_Interface
         * source       for displaying W_Dependency_Source_Interface
         * action       for displaying W_Dependency_Action_Interface

 ***** [Available options] ****************************************************

   use: -&amp;lt;option&amp;gt; , no value (no '=...')

   -v      verbose mode, debug information logged in ./wdependency.log
   -h      display this help
   -c      activate/use cache file for parsing optimization (generate/use ./wdependency.cache file)
   -cc     clean existing cache file

   use: --&amp;lt;option&amp;gt;=&amp;lt;value&amp;gt; , no default value, '=&amp;lt;value&amp;gt;' is required

   --action      load custom action(s) (list separator: ,), specified by class name
   --aggregator  load custom aggregator(s) (list separator: ,), specified by class name
   --analyzer    load custom analyzer(s) (list separator: ,), specified by class name
   --bottom      keep only nodes that are in the specified bottom rank (top X) when computing weight from links
   --by          aggregate nodes using the specified algorithm:
         * dir          aggregate by directories (dirname on / of node)
         * package      aggregate by package (dirname on _ of node)
         * package#X    aggregate by package at position X
         * dir#X        aggregate by directory at position X
   --class       keep only nodes that are used by specified class
   --dir         keep only nodes that are used by file in specified directory
   --exporter    load custom exporter(s) (list separator: ,), specified by class name
   --file        keep only nodes that are used by specified file
   --filter      load custom filter(s) (list separator: ,), specified by class name
   --format      list of export format:
         * png          PNG picture file
         * jpg          JPG picture file
         * gif          GIF picture file
         * dot          GraphViz DOT text format
         * graphml      GraphML xml format
         * json         JavaScript Object Notation text format
         * php          PHP file (return array(...);)
         * svg          Scalable Vector Graphics picture format (xml)
   --has         keep only nodes that have links
   --layout      graphviz (dot) layout to use, by default 'dot', type dot -K? to see available list
   --link        keep only nodes that have link to specified node
   --linked-to   keep only links to specified dependency
   --listener    load custom listener(s) (list separator: ,), specified by class name
   --load        loads the specified file as a data source (from previous analyzes, PHP format supported only)
   --max         keep only nodes that have a maximum of links specified
   --max-link-weight  keep only links that have less than specified weight
   --min         keep only nodes that have at least the minimum links specified
   --min-link-weight  keep only links that have more than specified weight
   --n           keep only nodes that have number of nodes specified
   --node        keep only nodes that are used by specified node
   --nolink      keep only nodes that have not link to specified node
   --none        keep only nodes that have no links
   --package     keep only nodes that are used by class in specified package
   --pattern     keep only nodes that have name matching specified pattern
   --prefix      keep only nodes that have name beginning with specified prefix
   --reverse     reverse link order (user become used and used become user)
   --source      load custom source(s) (list separator: ,), specified by class name
   --subdirs-as-projects  use subdirectories as autonomous projects
   --template    php file template to render export (file exporter only), use $options and $data
   --top         keep only nodes that are in the specified top rank (top X) when computing weight from links

 ***** [Additional information] ***********************************************

   * additional options could be available dependending on the renderer
     template (i.e. phtml view file if used)

   * for schema / graph export in dot, png, jpg, ... you must have the
     graphviz binaries installed (dot binary)

 ***** [Software information] *************************************************

   wdependency v0.0.7, built on 2009-10-25
   Under BSD License, Olivier Hoareau &amp;lt;olivier a t phppro.fr&amp;gt; - PHPPRO

   PEAR package

&lt;/pre&gt;


&lt;p&gt;Le principe est simple&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;vous vous positionnez dans le répertoire racine à analyser&lt;/li&gt;
&lt;li&gt;vous indiquez l'action a effectuer et le format d'export voulu&lt;/li&gt;
&lt;li&gt;vous indiquez éventuellement les &quot;filtres / tri&quot; et les &quot;aggrégations&quot; voulues&lt;/li&gt;
&lt;li&gt;vous lancez wdependency avec tous ces paramètres&lt;/li&gt;
&lt;li&gt;wdependency va analyser chaque fichier PHP de répertoires du répertoire courant (récursif)&lt;/li&gt;
&lt;li&gt;il va construire un modèle de donnée en mémoire pour réprésenter les dépendances&lt;/li&gt;
&lt;li&gt;il va trier/filtrer les données&lt;/li&gt;
&lt;li&gt;il va exporter en jpg/png/... (i.e. le(s) format(s) que vous avez choisis)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Exemples&lt;/h2&gt;


&lt;p&gt;Vous pourrez ensuite générer le graphiques de dépendances entre vos répertoires de second niveau par exemple grâce à la commande&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
wdependency :package1
&lt;/pre&gt;


&lt;p&gt;un fichier png devrait apparaître dans le répertoire courant&lt;/p&gt;


&lt;p&gt;Ou bien générer le graphe d'héritage de vos classes&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
wdependency :inheritances
&lt;/pre&gt;


&lt;p&gt;Le graphe d'héritage d'une classe en particulier&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
wdependency :inheritances --node=MyPackage_MyClass
&lt;/pre&gt;


&lt;p&gt;...&lt;/p&gt;


&lt;h2&gt;Mise en cache du parsing pour aller plus vite&lt;/h2&gt;


&lt;p&gt;Il est possible de parser une fois et de mettre en cache le modèle de données résultant pour ensuite faire plusieurs &quot;requêtes&quot; sans devoir tout reparser à chaque fois&amp;nbsp;:&lt;/p&gt;


&lt;p&gt;Commencez par vider le cache et regénérer le fichier de cache (./wdependency.cache):&lt;/p&gt;

&lt;pre&gt;
wdependency -cc
wdependency :cache
&lt;/pre&gt;


&lt;p&gt;Puis exécutez n'importe laquelle des commandes comme d'habitude, vous verrez c'est plus rapide ;)&lt;/p&gt;


&lt;p&gt;Bien sûr il s'agit d'une version alpha certainement buggée, merci par avance pour vos retours sur le gestionnaire d'issues&amp;nbsp;: http://code.google.com/p/wdependency/issues/list&lt;/p&gt;


&lt;p&gt;Bon usage&amp;nbsp;!&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.phppro.fr/?post/2009/10/25/Analyse-de-dependances-classes/fichiers#comment-form</comments>
      <wfw:comment>http://blog.phppro.fr/?post/2009/10/25/Analyse-de-dependances-classes/fichiers#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.phppro.fr/?feed/atom/comments/62</wfw:commentRss>
      </item>
    
  <item>
    <title>Zend Framework demystified, act I...</title>
    <link>http://blog.phppro.fr/?post/2009/10/18/Zend-Framework-demystified-act-I</link>
    <guid isPermaLink="false">urn:md5:65e853ad658a124406357a64b356f687</guid>
    <pubDate>Sun, 18 Oct 2009 18:48:00 +0100</pubDate>
    <dc:creator>Olivier Hoareau</dc:creator>
        <category>Outillage</category>
        <category>code mort</category><category>dependance</category><category>dépendance</category><category>outils</category>    
    <description>&lt;p&gt;Voici une vue des dépendances entre package dans Zend Framework 1.8.3 réalisé avec un de mes outils d'analyse de code.&lt;/p&gt;    &lt;p&gt;&lt;a href=&quot;http://blog.phppro.fr/public/projects.png&quot;&gt;&lt;img src=&quot;http://blog.phppro.fr/public/./.projects_m.jpg&quot; alt=&quot;Graphes de dépendances entre packages ZF 1.8.3&quot; title=&quot;Graphes de dépendances entre packages ZF 1.8.3, oct 2009&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Je travaille actuellement sur l'analyse des dépendances entre classes, packages, applications / frameworks pour notamment cartographier les zones mortes des applis (i.e. code non utilisé), les zones de complexité ou de dette technique (i.e. point central ayant beaucoup de liaison...).&lt;br /&gt;
Après plusieurs heures de recherches d'une librairie de visualisation temps réel sur un graphe, je n'ai toujours pas trouvé mon bonheur pour parcourir en temps réel le graphe, je vous livre donc pour l'instant ma version graphviz (dot)&lt;/p&gt;


&lt;p&gt;Avez-vous d'autres techniques pour représenter les dépendances classes/applications/frameworks ?&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;PS: le noeud &lt;strong&gt;ROOT&lt;/strong&gt; correspond aux classes située à la racine du répertoire library/Zend, les autres noeuds correspondent aux répertoires situés dans library/Zend/&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.phppro.fr/?post/2009/10/18/Zend-Framework-demystified-act-I#comment-form</comments>
      <wfw:comment>http://blog.phppro.fr/?post/2009/10/18/Zend-Framework-demystified-act-I#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.phppro.fr/?feed/atom/comments/61</wfw:commentRss>
      </item>
    
  <item>
    <title>Intégration PHPUnit dans Eclipse</title>
    <link>http://blog.phppro.fr/?post/2009/07/08/Integration-PHPUnit-dans-Eclipse</link>
    <guid isPermaLink="false">urn:md5:b4c5c9b6f24ecf226c18e22f4aae0882</guid>
    <pubDate>Wed, 08 Jul 2009 23:18:00 +0100</pubDate>
    <dc:creator>Olivier Hoareau</dc:creator>
        <category>Outillage</category>
        <category>eclipse</category><category>eclipse pdt</category><category>outils</category><category>phpunit</category><category>tests</category><category>zend studio</category>    
    <description>&lt;p&gt;Une nouvelle intégration de PHPUnit 3.x dans Eclipse à la mode JUnit&lt;/p&gt;    &lt;p&gt;J'utilise Zend Studio et Eclipse PDT au quotidien chez mes clients.&lt;br /&gt;
Adepte du TDD (Test Driven Development), le support de PHPUnit dans Zend Studio est devenu plus qu'un confort pour moi, une véritable nécessité.&lt;br /&gt;
Pour mes clients qui choisissent Eclipse PDT plutôt que Zend Studio, j'étais jusqu'alors résigné à créer des boutons external tools dans Eclipse pour lancer en ligne de commande phpunit (efficace, mais rendu non graphique en mode console qui peut rebuter certains).&lt;br /&gt;
Sur ma demande d'aide, un de mes anciens collègues, Java-iste dans l'âme, et PHP-iste à ses heures perdues, a développé une intégration de PHPUnit 3.x dans Eclipse en open source.
Il s'agit d'un wrapper au plugin JUnit 4 existant dans Eclipse JDT permettant de lancer les tests unitaires PHPUnit (via la ligne de commande en fait) et d'afficher les résultats tel que JUnit le fait (et tel que le plugin PHPUnit de Zend Studio le fait).
Bien sûr il s'agit d'un premier jet, vos idées / remarques / demandes d'amélioration sont les bienvenues&amp;nbsp;!&lt;/p&gt;


&lt;p&gt;Sans plus attendre le site du projet open source&amp;nbsp;: http://code.google.com/p/phpunit4eclipse/wiki/j2phpUnitWrapper&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.phppro.fr/?post/2009/07/08/Integration-PHPUnit-dans-Eclipse#comment-form</comments>
      <wfw:comment>http://blog.phppro.fr/?post/2009/07/08/Integration-PHPUnit-dans-Eclipse#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.phppro.fr/?feed/atom/comments/45</wfw:commentRss>
      </item>
    
  <item>
    <title>Exemple de fichier build.xml pour un projet utilisant l'intégration continue</title>
    <link>http://blog.phppro.fr/?post/2009/06/05/Exemple-de-fichier-buildxml-pour-un-projet-utilisant-l-integration-continue</link>
    <guid isPermaLink="false">urn:md5:11e028e58140c183d870dbae43551270</guid>
    <pubDate>Fri, 05 Jun 2009 16:08:00 +0100</pubDate>
    <dc:creator>Olivier Hoareau</dc:creator>
        <category>Outillage</category>
        <category>build</category><category>build.xml</category><category>intégration continue</category><category>phing</category>    
    <description>&lt;p&gt;Vous utiliser PHP, Phing et vous souhaitez utiliser hudson, Xinc ou PHPUnderControl avec Phing&lt;/p&gt;    &lt;p&gt;Voici un fichier build.xml qui me sert souvent de base pour automatiser mes builds php en intégration continue.
Il n'est pas parfait, n'hésitez pas à proposer des améliorations ou proposer vos variantes / exemples, ils sont les bienvenus&amp;nbsp;!&lt;/p&gt;

&lt;pre&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;

&amp;lt;!-- vim: set expandtab tabstop=4 shiftwidth=4: --&amp;gt;

&amp;lt;project name=&amp;quot;php&amp;quot; default=&amp;quot;help&amp;quot;&amp;gt;

    &amp;lt;!-- ================================================================== --&amp;gt;
    &amp;lt;!-- Properties                                                         --&amp;gt;
    &amp;lt;!-- ================================================================== --&amp;gt;
    
    &amp;lt;!-- *** Project General Properties *********************************** --&amp;gt;

    &amp;lt;property name=&amp;quot;home&amp;quot;         value=&amp;quot;${project.basedir}&amp;quot;/&amp;gt;
    &amp;lt;property name=&amp;quot;src.dir&amp;quot;      value=&amp;quot;library&amp;quot;/&amp;gt;
    &amp;lt;property name=&amp;quot;test.dir&amp;quot;     value=&amp;quot;tests&amp;quot;/&amp;gt;
    &amp;lt;property name=&amp;quot;report.dir&amp;quot;   value=&amp;quot;reports&amp;quot;/&amp;gt;
    &amp;lt;property name=&amp;quot;doc.dir&amp;quot;      value=&amp;quot;docs&amp;quot;/&amp;gt;
    &amp;lt;property name=&amp;quot;context.dir&amp;quot;  value=&amp;quot;contexts&amp;quot;/&amp;gt;
    &amp;lt;property name=&amp;quot;config.dir&amp;quot;   value=&amp;quot;config&amp;quot;/&amp;gt;
    &amp;lt;property name=&amp;quot;convention&amp;quot;   value=&amp;quot;PEAR&amp;quot;/&amp;gt;

    &amp;lt;!-- *** Project Custom Properties ************************************ --&amp;gt;

    &amp;lt;property file=&amp;quot;${home}/${config.dir}/build.properties&amp;quot;   override=&amp;quot;true&amp;quot;/&amp;gt;
    &amp;lt;property file=&amp;quot;${home}/${config.dir}/${conf}.properties&amp;quot; override=&amp;quot;true&amp;quot;/&amp;gt;

    &amp;lt;!-- *** Project Common Properties ************************************ --&amp;gt;

    &amp;lt;property name=&amp;quot;package.name&amp;quot;   value=&amp;quot;${application.name}&amp;quot;/&amp;gt;

    &amp;lt;!-- ================================================================== --&amp;gt;
    &amp;lt;!-- Targets                                                            --&amp;gt;
    &amp;lt;!-- ================================================================== --&amp;gt;

    &amp;lt;!-- *** $ phing help ************************************************* --&amp;gt;

    &amp;lt;target name        = &amp;quot;help&amp;quot;
            depends     = &amp;quot;&amp;quot;
            description = &amp;quot;Information about this build file&amp;quot;&amp;gt;

        &amp;lt;echo&amp;gt;${package.name} Phing Build commands&amp;lt;/echo&amp;gt;

    &amp;lt;/target&amp;gt;

    &amp;lt;!-- *** $ phing inits ************************************************ --&amp;gt;

    &amp;lt;target name        = &amp;quot;inits&amp;quot;
            depends     = &amp;quot;&amp;quot;
            description = &amp;quot;Initializes the application environment&amp;quot;&amp;gt;

        &amp;lt;!-- /library --&amp;gt;
        &amp;lt;mkdir dir=&amp;quot;${home}/${src.dir}&amp;quot;/&amp;gt;

        &amp;lt;!-- /tests --&amp;gt;
        &amp;lt;mkdir dir=&amp;quot;${home}/${test.dir}&amp;quot;/&amp;gt;
        &amp;lt;mkdir dir=&amp;quot;${home}/${test.dir}/phpunit&amp;quot;/&amp;gt;
        &amp;lt;mkdir dir=&amp;quot;${home}/${test.dir}/fitnesse&amp;quot;/&amp;gt;
        &amp;lt;mkdir dir=&amp;quot;${home}/${test.dir}/selenium&amp;quot;/&amp;gt;
        &amp;lt;mkdir dir=&amp;quot;${home}/${test.dir}/jsunit&amp;quot;/&amp;gt;

        &amp;lt;!-- /reports --&amp;gt;
        &amp;lt;mkdir dir=&amp;quot;${home}/${report.dir}&amp;quot;/&amp;gt;
        &amp;lt;mkdir dir=&amp;quot;${home}/${report.dir}/phpunit&amp;quot;/&amp;gt;
        &amp;lt;mkdir dir=&amp;quot;${home}/${report.dir}/coverage&amp;quot;/&amp;gt;
        &amp;lt;mkdir dir=&amp;quot;${home}/${report.dir}/codesniffer&amp;quot;/&amp;gt;

        &amp;lt;!-- /docs --&amp;gt;
        &amp;lt;mkdir dir=&amp;quot;${home}/${doc.dir}&amp;quot;/&amp;gt;
        &amp;lt;mkdir dir=&amp;quot;${home}/${doc.dir}/api&amp;quot;/&amp;gt;

        &amp;lt;!-- /contexts --&amp;gt;
        &amp;lt;mkdir dir=&amp;quot;${home}/${context.dir}&amp;quot;/&amp;gt;

    &amp;lt;/target&amp;gt;

    &amp;lt;!-- *** $ phing tests-unit ******************************************* --&amp;gt;

    &amp;lt;target name        = &amp;quot;tests-unit&amp;quot;
            depends     = &amp;quot;inits&amp;quot;
            description = &amp;quot;Executes unit tests (PHPUnit)&amp;quot;&amp;gt;

        &amp;lt;php expression=&amp;quot;require_once '${home}/${context.dir}/phpunit.php'&amp;quot;/&amp;gt;

        &amp;lt;phpunit2 haltonfailure=&amp;quot;false&amp;quot; printsummary=&amp;quot;true&amp;quot;&amp;gt;
            &amp;lt;batchtest classpath=&amp;quot;${home}/${src.dir}&amp;quot;&amp;gt;
                &amp;lt;fileset dir=&amp;quot;${home}&amp;quot;&amp;gt;
                    &amp;lt;include name=&amp;quot;${test.dir}/phpunit/**/*Test.php&amp;quot; /&amp;gt;
                &amp;lt;/fileset&amp;gt;
            &amp;lt;/batchtest&amp;gt;
            &amp;lt;formatter type    = &amp;quot;xml&amp;quot;
                       todir   = &amp;quot;${home}/${report.dir}/phpunit&amp;quot;
                       outfile = &amp;quot;tests-report.xml&amp;quot; /&amp;gt;
        &amp;lt;/phpunit2&amp;gt;

        &amp;lt;phpunit2report
            infile = &amp;quot;${home}/${report.dir}/phpunit/tests-report.xml&amp;quot;
            format = &amp;quot;frames&amp;quot;
            todir  = &amp;quot;${home}/${report.dir}/phpunit&amp;quot; /&amp;gt;

    &amp;lt;/target&amp;gt;

    &amp;lt;!-- *** $ phing tests-unit-with-coverage ***************************** --&amp;gt;

    &amp;lt;target name        = &amp;quot;tests-unit-with-coverage&amp;quot;
            depends     = &amp;quot;inits&amp;quot;
            description = &amp;quot;Executes unit tests (PHPUnit), coverage (XDebug)&amp;quot;&amp;gt;

        &amp;lt;php expression=&amp;quot;require_once '${home}/${context.dir}/phpunit.php'&amp;quot;/&amp;gt;

        &amp;lt;coverage-setup database=&amp;quot;${home}/${report.dir}/coverage/coverage.db&amp;quot;&amp;gt;
            &amp;lt;fileset dir=&amp;quot;${home}&amp;quot;&amp;gt;
                &amp;lt;include name=&amp;quot;${src.dir}/**/*.php&amp;quot; /&amp;gt;
                &amp;lt;exclude name=&amp;quot;${src.dir}/**/*Test.php&amp;quot; /&amp;gt;
            &amp;lt;/fileset&amp;gt;
        &amp;lt;/coverage-setup&amp;gt;

        &amp;lt;phpunit2 haltonfailure = &amp;quot;false&amp;quot;
                  printsummary  = &amp;quot;true&amp;quot;
                  codecoverage  = &amp;quot;true&amp;quot;&amp;gt;
            &amp;lt;batchtest classpath=&amp;quot;${home}/${src.dir}&amp;quot;&amp;gt;
                &amp;lt;fileset dir=&amp;quot;${home}&amp;quot;&amp;gt;
                    &amp;lt;include name=&amp;quot;${test.dir}/**/*Test.php&amp;quot; /&amp;gt;
                &amp;lt;/fileset&amp;gt;
            &amp;lt;/batchtest&amp;gt;
            &amp;lt;formatter type    = &amp;quot;xml&amp;quot;
                       todir   = &amp;quot;${home}/${report.dir}/phpunit&amp;quot;
                       outfile = &amp;quot;tests-report.xml&amp;quot; /&amp;gt;
        &amp;lt;/phpunit2&amp;gt;

        &amp;lt;coverage-report outfile=&amp;quot;${home}/${report.dir}/coverage/coverage.db&amp;quot;&amp;gt;
            &amp;lt;report todir=&amp;quot;${home}/${report.dir}/coverage&amp;quot; /&amp;gt;
        &amp;lt;/coverage-report&amp;gt;

        &amp;lt;phpunit2report
            infile = &amp;quot;${home}/${report.dir}/phpunit/tests-report.xml&amp;quot;
            format = &amp;quot;frames&amp;quot;
            todir  = &amp;quot;${home}/${report.dir}/phpunit&amp;quot; /&amp;gt;

    &amp;lt;/target&amp;gt;

    &amp;lt;!-- *** $ phing tests-functional ************************************* --&amp;gt;

    &amp;lt;target name        = &amp;quot;tests-functional&amp;quot;
            depends     = &amp;quot;inits&amp;quot;
            description = &amp;quot;Executes functional tests (Fitnesse)&amp;quot;&amp;gt;


    &amp;lt;/target&amp;gt;

    &amp;lt;!-- *** $ phing tests-javascript ************************************* --&amp;gt;

    &amp;lt;target name        = &amp;quot;tests-javascript&amp;quot;
            depends     = &amp;quot;inits&amp;quot;
            description = &amp;quot;Executes javascript tests (JSUnit)&amp;quot;&amp;gt;


    &amp;lt;/target&amp;gt;

    &amp;lt;!-- *** $ phing tests-gui ******************************************** --&amp;gt;

    &amp;lt;target name        = &amp;quot;tests-gui&amp;quot;
            depends     = &amp;quot;inits&amp;quot;
            description = &amp;quot;Executes graphical user interface tests (Selenium)&amp;quot;&amp;gt;


    &amp;lt;/target&amp;gt;

    &amp;lt;!-- *** $ phing tests ************************************************ --&amp;gt;

    &amp;lt;target name        = &amp;quot;tests&amp;quot;
            depends     = &amp;quot;tests-unit-with-coverage,tests-functional,tests-javascript,tests-gui&amp;quot;
            description = &amp;quot;Generates all tests reports for project&amp;quot;&amp;gt;



    &amp;lt;/target&amp;gt;

    &amp;lt;!-- *** $ phing checks-convention ************************************ --&amp;gt;

    &amp;lt;target name        = &amp;quot;checks-convention&amp;quot;
            depends     = &amp;quot;inits&amp;quot;
            description = &amp;quot;Checks the quality of the code towards convention&amp;quot;&amp;gt;
            
        &amp;lt;php expression=&amp;quot;$cwd = getcwd()&amp;quot; returnProperty=&amp;quot;cwd&amp;quot;/&amp;gt;

        &amp;lt;phpcs  outputFile   = &amp;quot;${home}/${report.dir}/codesniffer/checks-report.xml&amp;quot;
                standard     = &amp;quot;${convention}&amp;quot;
                showWarnings = &amp;quot;true&amp;quot;
                tabWidth     = &amp;quot;4&amp;quot;
                format       = &amp;quot;checkstyle&amp;quot;&amp;gt;
                &amp;lt;fileset dir=&amp;quot;${home}/${src.dir}&amp;quot;&amp;gt;
                &amp;lt;include name=&amp;quot;**/*.php&amp;quot; /&amp;gt;
                &amp;lt;include name=&amp;quot;**/*.phtml&amp;quot; /&amp;gt;
            &amp;lt;/fileset&amp;gt;
        &amp;lt;/phpcs&amp;gt;

        &amp;lt;php expression=&amp;quot;chdir('${cwd}')&amp;quot;/&amp;gt;
        
        &amp;lt;xslt file   = &amp;quot;${home}/${report.dir}/codesniffer/checks-report.xml&amp;quot;
              tofile = &amp;quot;${home}/${report.dir}/codesniffer/index.html&amp;quot;
              style  = &amp;quot;${home}/${config.dir}/codesniffer.xsl&amp;quot; /&amp;gt;

    &amp;lt;/target&amp;gt;

    &amp;lt;!-- *** $ phing checks-syntax **************************************** --&amp;gt;

    &amp;lt;target name        = &amp;quot;checks-syntax&amp;quot;
            depends     = &amp;quot;inits&amp;quot;
            description = &amp;quot;Checks the syntax of the code (Lint)&amp;quot;&amp;gt;

        &amp;lt;phplint haltonfailure=&amp;quot;true&amp;quot;&amp;gt;
            &amp;lt;fileset dir=&amp;quot;${home}&amp;quot;&amp;gt;
                &amp;lt;include name=&amp;quot;${src.dir}/**/*.php&amp;quot;/&amp;gt;
                &amp;lt;include name=&amp;quot;${src.dir}/**/*.phtml&amp;quot;/&amp;gt;
            &amp;lt;/fileset&amp;gt;
        &amp;lt;/phplint&amp;gt;

    &amp;lt;/target&amp;gt;

    &amp;lt;!-- *** $ phing checks *********************************************** --&amp;gt;

    &amp;lt;target name        = &amp;quot;checks&amp;quot;
            depends     = &amp;quot;checks-convention,checks-syntax&amp;quot;
            description = &amp;quot;Executes checking operations (convention,syntax)&amp;quot;&amp;gt;



    &amp;lt;/target&amp;gt;

    &amp;lt;!-- *** $ phing builds-on-commit ************************************* --&amp;gt;

    &amp;lt;target name        = &amp;quot;builds-on-commit&amp;quot;
            depends     = &amp;quot;tests-unit&amp;quot;
            description = &amp;quot;Continous integration Light-build on svn commit&amp;quot;&amp;gt;



    &amp;lt;/target&amp;gt;

    &amp;lt;!-- *** $ phing builds-nightly *************************************** --&amp;gt;

    &amp;lt;target name        = &amp;quot;builds-nightly&amp;quot;
            depends     = &amp;quot;tests,checks,docs&amp;quot;
            description = &amp;quot;Continuous integration full nightly-build&amp;quot;&amp;gt;



    &amp;lt;/target&amp;gt;

    &amp;lt;!-- *** $ phing docs-api ********************************************* --&amp;gt;

    &amp;lt;target name        = &amp;quot;docs-api&amp;quot;
            depends     = &amp;quot;inits&amp;quot;
            description = &amp;quot;Generates the PHPDocumentor API Documentation&amp;quot;&amp;gt;

        &amp;lt;phpdoc title               = &amp;quot;${package.name} API Documentation&amp;quot;
                destdir             = &amp;quot;${home}/${doc.dir}/api&amp;quot;
                sourcecode          = &amp;quot;yes&amp;quot;
                output              = &amp;quot;HTML:Smarty:PHP&amp;quot;
                defaultcategoryname = &amp;quot;${package.name}&amp;quot;
                defaultpackagename  = &amp;quot;${package.name}&amp;quot;&amp;gt;
            &amp;lt;fileset dir=&amp;quot;${home}&amp;quot;&amp;gt;
                &amp;lt;include name=&amp;quot;${src.dir}/**&amp;quot; /&amp;gt;
                &amp;lt;include name=&amp;quot;${test.dir}/phpunit/**&amp;quot; /&amp;gt;
                &amp;lt;include name=&amp;quot;${test.dir}/fitnesse/**&amp;quot; /&amp;gt;
            &amp;lt;/fileset&amp;gt;
            &amp;lt;projdocfileset dir=&amp;quot;${home}/${src.dir}&amp;quot;&amp;gt;
            &amp;lt;/projdocfileset&amp;gt;
        &amp;lt;/phpdoc&amp;gt;

    &amp;lt;/target&amp;gt;

    &amp;lt;!-- *** $ phing docs ************************************************* --&amp;gt;

    &amp;lt;target name        = &amp;quot;docs&amp;quot;
            depends     = &amp;quot;docs-api&amp;quot;
            description = &amp;quot;Generates all documentation for project&amp;quot;&amp;gt;



    &amp;lt;/target&amp;gt;
    
    &amp;lt;!-- *** $ phing deploys-testfunc ************************************* --&amp;gt;

    &amp;lt;target name        = &amp;quot;deploys-testfunc&amp;quot;
            depends     = &amp;quot;tests-unit&amp;quot;
            description = &amp;quot;Executes unit tests and deploys a tag of the application on functional tests platform&amp;quot;&amp;gt;

        &amp;lt;echo&amp;gt;Deploying on functional tests platform...&amp;lt;/echo&amp;gt;

        &amp;lt;echo&amp;gt;@todo: specific function tests platform pre-deployment tasks...&amp;lt;/echo&amp;gt;

        &amp;lt;phingcall target=&amp;quot;_template-deploys&amp;quot;&amp;gt;
            &amp;lt;property name=&amp;quot;${deploy.platform}&amp;quot; value=&amp;quot;testfunc&amp;quot;/&amp;gt;
        &amp;lt;/phingcall&amp;gt;
        
        &amp;lt;echo&amp;gt;@todo: specific functional tests platform post-deployment tasks...&amp;lt;/echo&amp;gt;

        &amp;lt;echo&amp;gt;Application deployed on functional tests platform.&amp;lt;/echo&amp;gt;

    &amp;lt;/target&amp;gt;

    &amp;lt;!-- *** $ phing deploys-integ **************************************** --&amp;gt;

    &amp;lt;target name        = &amp;quot;deploys-integ&amp;quot;
            depends     = &amp;quot;tests-unit&amp;quot;
            description = &amp;quot;Executes unit tests and deploys a tag of the application on integration&amp;quot;&amp;gt;

        &amp;lt;echo&amp;gt;Deploying on integration...&amp;lt;/echo&amp;gt;

        &amp;lt;echo&amp;gt;@todo: specific integration pre-deployment tasks...&amp;lt;/echo&amp;gt;

        &amp;lt;phingcall target=&amp;quot;_template-deploys&amp;quot;&amp;gt;
            &amp;lt;property name=&amp;quot;${deploy.platform}&amp;quot; value=&amp;quot;integ&amp;quot;/&amp;gt;
        &amp;lt;/phingcall&amp;gt;
        
        &amp;lt;echo&amp;gt;@todo: specific integration post-deployment tasks...&amp;lt;/echo&amp;gt;

        &amp;lt;echo&amp;gt;Application deployed on integration.&amp;lt;/echo&amp;gt;

    &amp;lt;/target&amp;gt;

    &amp;lt;!-- *** $ phing deploys-preprod ************************************** --&amp;gt;

    &amp;lt;target name        = &amp;quot;deploys-preprod&amp;quot;
            depends     = &amp;quot;tests-unit&amp;quot;
            description = &amp;quot;Executes unit tests and deploys a tag of the application on pre-production&amp;quot;&amp;gt;

        &amp;lt;echo&amp;gt;Deploying on preproduction...&amp;lt;/echo&amp;gt;

        &amp;lt;echo&amp;gt;@todo: specific preproduction pre-deployment tasks...&amp;lt;/echo&amp;gt;

        &amp;lt;phingcall target=&amp;quot;_template-deploys&amp;quot;&amp;gt;
            &amp;lt;property name=&amp;quot;${deploy.platform}&amp;quot; value=&amp;quot;preprod&amp;quot;/&amp;gt;
        &amp;lt;/phingcall&amp;gt;

        &amp;lt;echo&amp;gt;@todo: specific preproduction post-deployment tasks...&amp;lt;/echo&amp;gt;

        &amp;lt;echo&amp;gt;Application deployed on preproduction.&amp;lt;/echo&amp;gt;

    &amp;lt;/target&amp;gt;

    &amp;lt;!-- *** $ phing deploys-prod ***************************************** --&amp;gt;

    &amp;lt;target name        = &amp;quot;deploys-prod&amp;quot;
            depends     = &amp;quot;tests-unit&amp;quot;
            description = &amp;quot;Executes unit tests and deploys a tag of the application on production&amp;quot;&amp;gt;

        &amp;lt;echo&amp;gt;Deploying on production...&amp;lt;/echo&amp;gt;

        &amp;lt;echo&amp;gt;@todo: specific production pre-deployment tasks...&amp;lt;/echo&amp;gt;

        &amp;lt;phingcall target=&amp;quot;_template-deploys&amp;quot;&amp;gt;
            &amp;lt;property name=&amp;quot;${deploy.platform}&amp;quot; value=&amp;quot;prod&amp;quot;/&amp;gt;
        &amp;lt;/phingcall&amp;gt;
        
        &amp;lt;echo&amp;gt;@todo: specific production post-deployment tasks...&amp;lt;/echo&amp;gt;

        &amp;lt;echo&amp;gt;Application deployed on production.&amp;lt;/echo&amp;gt;

    &amp;lt;/target&amp;gt;

    &amp;lt;!-- *** internal task ************************************************ --&amp;gt;

    &amp;lt;target name        = &amp;quot;_template-deploys&amp;quot;
            depends     = &amp;quot;tests-unit&amp;quot;
            description = &amp;quot;Template - Executes unit tests and deploys a tag of the application on a platform&amp;quot;&amp;gt;

        &amp;lt;if&amp;gt;
            &amp;lt;isnotset property=&amp;quot;deploy.platform&amp;quot;/&amp;gt;
            &amp;lt;then&amp;gt;
                &amp;lt;fail&amp;gt;You must set the deploy.platform property with the name of the platform to deploy on&amp;lt;/fail&amp;gt;
            &amp;lt;/then&amp;gt;
        &amp;lt;/if&amp;gt;

        &amp;lt;if&amp;gt;
            &amp;lt;isnotset property=&amp;quot;tag&amp;quot;/&amp;gt;
            &amp;lt;then&amp;gt;
                &amp;lt;fail&amp;gt;You must provide a svn tag in order to deploy this tag on ${deploy.platform}&amp;lt;/fail&amp;gt;
            &amp;lt;/then&amp;gt;
        &amp;lt;/if&amp;gt;

        &amp;lt;property file=&amp;quot;${home}/${config.dir}/platforms/${deploy.platform}.properties&amp;quot; override=&amp;quot;true&amp;quot; /&amp;gt;

        &amp;lt;property name=&amp;quot;deploy.src.dir&amp;quot; value=&amp;quot;${home}/${build.dir}/${deploy.platform}/${tag}&amp;quot; /&amp;gt;
        &amp;lt;property name=&amp;quot;svn.url&amp;quot;        value=&amp;quot;${svn.repo}/tags/${tag}&amp;quot; /&amp;gt;

        &amp;lt;svnexport svnpath       = &amp;quot;${svn.bin}&amp;quot;
                   username      = &amp;quot;${svn.username}&amp;quot;
                   password      = &amp;quot;${svn.password}&amp;quot;
                   force         = &amp;quot;true&amp;quot;
                   nocache       = &amp;quot;true&amp;quot;
                   repositoryurl = &amp;quot;${svn.url}&amp;quot;
                   todir         = &amp;quot;${deploy.src.dir}&amp;quot;/&amp;gt;
        
        &amp;lt;echo&amp;gt;@todo : deployment (zip ${deploy.src.dir, then ftp, ...) &amp;lt;/echo&amp;gt;

        &amp;lt;fail&amp;gt;@remove: Not yet implemented&amp;lt;/fail&amp;gt;

    &amp;lt;/target&amp;gt;

&amp;lt;/project&amp;gt;
&lt;/pre&gt;</description>
    
    
    
          <comments>http://blog.phppro.fr/?post/2009/06/05/Exemple-de-fichier-buildxml-pour-un-projet-utilisant-l-integration-continue#comment-form</comments>
      <wfw:comment>http://blog.phppro.fr/?post/2009/06/05/Exemple-de-fichier-buildxml-pour-un-projet-utilisant-l-integration-continue#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.phppro.fr/?feed/atom/comments/41</wfw:commentRss>
      </item>
    
  <item>
    <title>LivePHP.net : tester les différentes versions de PHP !</title>
    <link>http://blog.phppro.fr/?post/2009/05/18/LivePHPnet-%3A-tester-les-differentes-versions-de-PHP</link>
    <guid isPermaLink="false">urn:md5:642d4cae46628c46239fbe322320fcec</guid>
    <pubDate>Mon, 18 May 2009 08:00:00 +0100</pubDate>
    <dc:creator>Olivier Hoareau</dc:creator>
        <category>Outillage</category>
            
    <description>&lt;p&gt;PHP.net est notre référence à tous pour trouver LA documentation sur PHP. Mais si vous êtes comme moi, vous êtes peut être souvent confronté à plusieurs versions de PHP sur vos projets ou chez vos clients. Comment être sûr qu'une fonction PHP se comporte de la même façon dans une version plus ancienne que la doc PHP.net&amp;nbsp;? suivez le guide ;)&lt;/p&gt;    &lt;p&gt;Voici un nouveau service en ligne qui vous permettra de tester une bonne partie (toutes les fonctions ne sont pas couvertes, pour raisons de sécurité ;)) des fonctions PHP sous forme d'une API Web services (format XML, json...).&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Le principe est simple vous pouvez récupérer le résultat d'une fonction php en appelant l'url&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
http://livephp.net/functions/&amp;lt;nom-de-la-fonction&amp;gt;/&amp;lt;param1&amp;gt;/&amp;lt;param2&amp;gt;/....?format=&amp;lt;format&amp;gt;&amp;amp;version=&amp;lt;liste-des-versions-php&amp;gt;
&lt;/pre&gt;


&lt;p&gt;Voici quelques exemples&amp;nbsp;:&lt;/p&gt;


&lt;h3&gt;Liste des services disponibles&lt;/h3&gt;
&lt;pre&gt;
http://livephp.net

&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; ?&amp;gt;

&amp;lt;response&amp;gt;
	&amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt;
	&amp;lt;message&amp;gt;success&amp;lt;/message&amp;gt;
	&amp;lt;results&amp;gt;
		&amp;lt;service id=&amp;quot;http://livephp.net/functions&amp;quot;&amp;gt;array (
  0 =&amp;gt; 'Call http://livephp.net/functions to get the list of available function for specified PHP version (version= parameter, or default PHP version)',
  1 =&amp;gt; 'Call http://livephp.net/functions/[function_name]/[arg1]/[arg2]/... to call function_name(arg1,arg2,...) and get the result back',
  2 =&amp;gt; 'You can use parameters : format=[format], version=[version], reference=[version,version,...|all]',
)&amp;lt;/service&amp;gt;
		&amp;lt;service id=&amp;quot;http://livephp.net/formats&amp;quot;&amp;gt;Call http://livephp.net/formats to get the list of available formats to use with the 'format=' parameter&amp;lt;/service&amp;gt;

		&amp;lt;service id=&amp;quot;http://livephp.net/versions&amp;quot;&amp;gt;Call http://livephp.net/versions to get the list of available PHP versions with the 'version=' parameter&amp;lt;/service&amp;gt;
	&amp;lt;/results&amp;gt;
&amp;lt;/response&amp;gt;
&lt;/pre&gt;

&lt;h3&gt;Liste des versions disponibles&lt;/h3&gt;
&lt;pre&gt;
http://livephp.net/versions

&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; ?&amp;gt;

&amp;lt;response&amp;gt;
	&amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt;
	&amp;lt;message&amp;gt;success&amp;lt;/message&amp;gt;
	&amp;lt;results&amp;gt;
		&amp;lt;version&amp;gt;4.4.9&amp;lt;/version&amp;gt;
		&amp;lt;version&amp;gt;5.0.5&amp;lt;/version&amp;gt;

		&amp;lt;version&amp;gt;5.1.0&amp;lt;/version&amp;gt;
		&amp;lt;version&amp;gt;5.1.6&amp;lt;/version&amp;gt;
		&amp;lt;version&amp;gt;5.2.0&amp;lt;/version&amp;gt;
		&amp;lt;version&amp;gt;5.2.1&amp;lt;/version&amp;gt;
		&amp;lt;version&amp;gt;5.2.2&amp;lt;/version&amp;gt;
		&amp;lt;version&amp;gt;5.2.3&amp;lt;/version&amp;gt;

		&amp;lt;version&amp;gt;5.2.4&amp;lt;/version&amp;gt;
		&amp;lt;version&amp;gt;5.2.5&amp;lt;/version&amp;gt;
		&amp;lt;version&amp;gt;5.2.6&amp;lt;/version&amp;gt;
		&amp;lt;version&amp;gt;5.2.8&amp;lt;/version&amp;gt;
		&amp;lt;version&amp;gt;5.2.9&amp;lt;/version&amp;gt;
		&amp;lt;version&amp;gt;5.3-dev&amp;lt;/version&amp;gt;

		&amp;lt;version&amp;gt;6.0-dev&amp;lt;/version&amp;gt;
	&amp;lt;/results&amp;gt;
&amp;lt;/response&amp;gt;
&lt;/pre&gt;

&lt;h3&gt;Liste des formats disponibles&lt;/h3&gt;
&lt;pre&gt;
http://livephp.net/formats

&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; ?&amp;gt;

&amp;lt;response&amp;gt;
	&amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt;
	&amp;lt;message&amp;gt;success&amp;lt;/message&amp;gt;
	&amp;lt;results&amp;gt;
		&amp;lt;format&amp;gt;xml&amp;lt;/format&amp;gt;
		&amp;lt;format&amp;gt;json&amp;lt;/format&amp;gt;

		&amp;lt;format&amp;gt;php&amp;lt;/format&amp;gt;
		&amp;lt;format&amp;gt;js&amp;lt;/format&amp;gt;
		&amp;lt;format&amp;gt;raw&amp;lt;/format&amp;gt;
		&amp;lt;format&amp;gt;csv&amp;lt;/format&amp;gt;
	&amp;lt;/results&amp;gt;
&amp;lt;/response&amp;gt;
&lt;/pre&gt;

&lt;h3&gt;Liste des fonctions disponibles pour la dernière release stable de PHP&lt;/h3&gt;
&lt;pre&gt;
http://livephp.net/functions

&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; ?&amp;gt;

&amp;lt;response&amp;gt;
	&amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt;
	&amp;lt;message&amp;gt;success&amp;lt;/message&amp;gt;
	&amp;lt;results&amp;gt;
		&amp;lt;return version=&amp;quot;5.2.9&amp;quot; duration=&amp;quot;0.00588488578796&amp;quot;&amp;gt;array (
  'internal' =&amp;gt; 
  array (
    0 =&amp;gt; 'zend_version',
    1 =&amp;gt; 'func_num_args',
    2 =&amp;gt; 'func_get_arg',
    3 =&amp;gt; 'func_get_args',
    4 =&amp;gt; 'strlen',
    5 =&amp;gt; 'strcmp',
    6 =&amp;gt; 'strncmp',
    7 =&amp;gt; 'strcasecmp',
    ...
  ),
  'user' =&amp;gt; 
  array (
  ),
)&amp;lt;/return&amp;gt;
	&amp;lt;/results&amp;gt;
&amp;lt;/response&amp;gt;
&lt;/pre&gt;

&lt;h3&gt;Ex: substr('test',0,3) =&amp;gt; 'tes'&lt;/h3&gt;
&lt;pre&gt;
http://livephp.net/functions/substr/test/0/3?version=all&amp;amp;format=csv

type,value,version,duration
return,tes,4.4.9,0.0035560131073
return,tes,5.0.5,0.00384306907654
return,tes,5.1.0,0.00425505638123
return,tes,5.1.6,0.00440287590027
return,tes,5.2.0,0.00467205047607
return,tes,5.2.1,0.0046968460083
return,tes,5.2.2,0.00472688674927
return,tes,5.2.3,0.00475788116455
return,tes,5.2.4,0.00470304489136
return,tes,5.2.5,0.00474095344543
return,tes,5.2.6,0.00479793548584
return,tes,5.2.8,0.00478100776672
return,tes,5.2.9,0.00476813316345
return,tes,5.3-dev,0.00529599189758
return,tes,6.0-dev,0.00888299942017
&lt;/pre&gt;

&lt;h3&gt;Ex: array_merge(array(1,2,3),1) =&amp;gt; comportement différent entre PHP 4 et PHP 5&lt;/h3&gt;
&lt;pre&gt;
http://livephp.net/functions/array_merge/[1,2,3]/1?version=all

&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; ?&amp;gt;

&amp;lt;response&amp;gt;
	&amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt;
	&amp;lt;message&amp;gt;success&amp;lt;/message&amp;gt;
	&amp;lt;results&amp;gt;
		&amp;lt;return version=&amp;quot;4.4.9&amp;quot; duration=&amp;quot;0.00359106063843&amp;quot;&amp;gt;array (
  0 =&amp;gt; 1,
  1 =&amp;gt; 2,
  2 =&amp;gt; 3,
  3 =&amp;gt; '1',
)&amp;lt;/return&amp;gt;
		&amp;lt;return version=&amp;quot;5.0.5&amp;quot; duration=&amp;quot;0.00379920005798&amp;quot;&amp;gt;false&amp;lt;/return&amp;gt;

		&amp;lt;return version=&amp;quot;5.1.0&amp;quot; duration=&amp;quot;0.00418400764465&amp;quot;&amp;gt;false&amp;lt;/return&amp;gt;
		&amp;lt;return version=&amp;quot;5.1.6&amp;quot; duration=&amp;quot;0.00437688827515&amp;quot;&amp;gt;false&amp;lt;/return&amp;gt;
		&amp;lt;return version=&amp;quot;5.2.0&amp;quot; duration=&amp;quot;0.00474405288696&amp;quot;&amp;gt;false&amp;lt;/return&amp;gt;
		&amp;lt;return version=&amp;quot;5.2.1&amp;quot; duration=&amp;quot;0.00470590591431&amp;quot;&amp;gt;false&amp;lt;/return&amp;gt;
		&amp;lt;return version=&amp;quot;5.2.2&amp;quot; duration=&amp;quot;0.004723072052&amp;quot;&amp;gt;false&amp;lt;/return&amp;gt;
		&amp;lt;return version=&amp;quot;5.2.3&amp;quot; duration=&amp;quot;0.00476813316345&amp;quot;&amp;gt;false&amp;lt;/return&amp;gt;

		&amp;lt;return version=&amp;quot;5.2.4&amp;quot; duration=&amp;quot;0.00476694107056&amp;quot;&amp;gt;false&amp;lt;/return&amp;gt;
		&amp;lt;return version=&amp;quot;5.2.5&amp;quot; duration=&amp;quot;0.00478100776672&amp;quot;&amp;gt;false&amp;lt;/return&amp;gt;
		&amp;lt;return version=&amp;quot;5.2.6&amp;quot; duration=&amp;quot;0.00486397743225&amp;quot;&amp;gt;false&amp;lt;/return&amp;gt;
		&amp;lt;return version=&amp;quot;5.2.8&amp;quot; duration=&amp;quot;0.00476217269897&amp;quot;&amp;gt;false&amp;lt;/return&amp;gt;
		&amp;lt;return version=&amp;quot;5.2.9&amp;quot; duration=&amp;quot;0.0047550201416&amp;quot;&amp;gt;false&amp;lt;/return&amp;gt;
		&amp;lt;return version=&amp;quot;5.3-dev&amp;quot; duration=&amp;quot;0.00532984733582&amp;quot;&amp;gt;false&amp;lt;/return&amp;gt;

		&amp;lt;return version=&amp;quot;6.0-dev&amp;quot; duration=&amp;quot;0.00882506370544&amp;quot;&amp;gt;false&amp;lt;/return&amp;gt;
	&amp;lt;/results&amp;gt;
&amp;lt;/response&amp;gt;
&lt;/pre&gt;

&lt;h3&gt;md5() non dispo dans PHP 6 (pour l'instant ?)&lt;/h3&gt;
&lt;pre&gt;
http://livephp.net/functions/md5/aaaaaaaaaaaaaga?version=6.0-dev,5.2.9&amp;amp;reference=5.2.9

&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; ?&amp;gt;

&amp;lt;response&amp;gt;
	&amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt;
	&amp;lt;message&amp;gt;success&amp;lt;/message&amp;gt;
	&amp;lt;results&amp;gt;
		&amp;lt;return version=&amp;quot;6.0-dev&amp;quot; duration=&amp;quot;0.00935697555542&amp;quot; regression=&amp;quot;true&amp;quot;&amp;gt;false&amp;lt;/return&amp;gt;
		&amp;lt;return version=&amp;quot;5.2.9&amp;quot; duration=&amp;quot;0.00510597229004&amp;quot;&amp;gt;a2543fd1f2af3fac6b0e273a18bbe219&amp;lt;/return&amp;gt;

	&amp;lt;/results&amp;gt;
&amp;lt;/response&amp;gt;
&lt;/pre&gt;

&lt;h3&gt;Lister les numéros de versions&lt;/h3&gt;
&lt;pre&gt;
http://livephp.net/functions/phpversion?version=all

&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; ?&amp;gt;

&amp;lt;response&amp;gt;
	&amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt;
	&amp;lt;message&amp;gt;success&amp;lt;/message&amp;gt;
	&amp;lt;results&amp;gt;
		&amp;lt;return version=&amp;quot;4.4.9&amp;quot; duration=&amp;quot;0.00354194641113&amp;quot;&amp;gt;4.4.9&amp;lt;/return&amp;gt;
		&amp;lt;return version=&amp;quot;5.0.5&amp;quot; duration=&amp;quot;0.00374889373779&amp;quot;&amp;gt;5.0.5&amp;lt;/return&amp;gt;

		&amp;lt;return version=&amp;quot;5.1.0&amp;quot; duration=&amp;quot;0.00420808792114&amp;quot;&amp;gt;5.1.0&amp;lt;/return&amp;gt;
		&amp;lt;return version=&amp;quot;5.1.6&amp;quot; duration=&amp;quot;0.00435781478882&amp;quot;&amp;gt;5.1.6&amp;lt;/return&amp;gt;
		&amp;lt;return version=&amp;quot;5.2.0&amp;quot; duration=&amp;quot;0.00470304489136&amp;quot;&amp;gt;5.2.0&amp;lt;/return&amp;gt;
		&amp;lt;return version=&amp;quot;5.2.1&amp;quot; duration=&amp;quot;0.00473499298096&amp;quot;&amp;gt;5.2.1&amp;lt;/return&amp;gt;
		&amp;lt;return version=&amp;quot;5.2.2&amp;quot; duration=&amp;quot;0.00475382804871&amp;quot;&amp;gt;5.2.2&amp;lt;/return&amp;gt;
		&amp;lt;return version=&amp;quot;5.2.3&amp;quot; duration=&amp;quot;0.00475478172302&amp;quot;&amp;gt;5.2.3&amp;lt;/return&amp;gt;

		&amp;lt;return version=&amp;quot;5.2.4&amp;quot; duration=&amp;quot;0.00473499298096&amp;quot;&amp;gt;5.2.4&amp;lt;/return&amp;gt;
		&amp;lt;return version=&amp;quot;5.2.5&amp;quot; duration=&amp;quot;0.0047550201416&amp;quot;&amp;gt;5.2.5&amp;lt;/return&amp;gt;
		&amp;lt;return version=&amp;quot;5.2.6&amp;quot; duration=&amp;quot;0.004802942276&amp;quot;&amp;gt;5.2.6&amp;lt;/return&amp;gt;
		&amp;lt;return version=&amp;quot;5.2.8&amp;quot; duration=&amp;quot;0.00480198860168&amp;quot;&amp;gt;5.2.8&amp;lt;/return&amp;gt;
		&amp;lt;return version=&amp;quot;5.2.9&amp;quot; duration=&amp;quot;0.00478005409241&amp;quot;&amp;gt;5.2.9&amp;lt;/return&amp;gt;
		&amp;lt;return version=&amp;quot;5.3-dev&amp;quot; duration=&amp;quot;0.00531506538391&amp;quot;&amp;gt;5.3.0RC3-dev&amp;lt;/return&amp;gt;

		&amp;lt;return version=&amp;quot;6.0-dev&amp;quot; duration=&amp;quot;0.00883913040161&amp;quot;&amp;gt;false&amp;lt;/return&amp;gt;
	&amp;lt;/results&amp;gt;
&amp;lt;/response&amp;gt;
&lt;/pre&gt;

&lt;h3&gt;Récupérer la valeur de retour de la fonction au format brut&lt;/h3&gt;
&lt;pre&gt;
http://livephp.net/functions/substr/my-test/0/2?format=raw

my
&lt;/pre&gt;

&lt;h3&gt;Format CSV&amp;nbsp;!&lt;/h3&gt;
&lt;pre&gt;
http://livephp.net/functions/ucfirst/my test?version=all&amp;amp;format=csv&amp;amp;sep=;

type;value;version;duration
return;My test;4.4.9;0.00356388092041
return;My test;5.0.5;0.00379014015198
return;My test;5.1.0;0.0042290687561
return;My test;5.1.6;0.00434899330139
return;My test;5.2.0;0.00467896461487
return;My test;5.2.1;0.00471687316895
return;My test;5.2.2;0.004723072052
return;My test;5.2.3;0.00476217269897
return;My test;5.2.4;0.00476408004761
return;My test;5.2.5;0.00472712516785
return;My test;5.2.6;0.0047709941864
return;My test;5.2.8;0.00476121902466
return;My test;5.2.9;0.00476288795471
return;My test;5.3-dev;0.00525689125061
return;My test;6.0-dev;0.00884604454041
&lt;/pre&gt;

&lt;h3&gt;Certaines fonctions sont désactivées&lt;/h3&gt;
&lt;pre&gt;
http://livephp.net/functions/exec/ls

&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; ?&amp;gt;

&amp;lt;response&amp;gt;
	&amp;lt;code&amp;gt;403&amp;lt;/code&amp;gt;
	&amp;lt;message&amp;gt;Function 'exec' has not been enabled&amp;lt;/message&amp;gt;
	&amp;lt;results&amp;gt;
	&amp;lt;/results&amp;gt;
&amp;lt;/response&amp;gt;
&lt;/pre&gt;

&lt;h3&gt;Utilisez la notation json pour passer un argument tableau ou objet&lt;/h3&gt;
&lt;pre&gt;
http://livephp.net/functions/json_encode/[1,2,3]?version=all

&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; ?&amp;gt;

&amp;lt;response&amp;gt;
	&amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt;
	&amp;lt;message&amp;gt;success&amp;lt;/message&amp;gt;
	&amp;lt;results&amp;gt;
		&amp;lt;return version=&amp;quot;4.4.9&amp;quot; duration=&amp;quot;0.00357604026794&amp;quot;&amp;gt;Error: Function 'json_encode' does not exist in PHP version '4.4.9'&amp;lt;/return&amp;gt;
		&amp;lt;return version=&amp;quot;5.0.5&amp;quot; duration=&amp;quot;0.00391697883606&amp;quot;&amp;gt;Error: Function 'json_encode' does not exist in PHP version '5.0.5'&amp;lt;/return&amp;gt;

		&amp;lt;return version=&amp;quot;5.1.0&amp;quot; duration=&amp;quot;0.00429391860962&amp;quot;&amp;gt;Error: Function 'json_encode' does not exist in PHP version '5.1.0'&amp;lt;/return&amp;gt;
		&amp;lt;return version=&amp;quot;5.1.6&amp;quot; duration=&amp;quot;0.0044469833374&amp;quot;&amp;gt;Error: Function 'json_encode' does not exist in PHP version '5.1.6'&amp;lt;/return&amp;gt;
		&amp;lt;return version=&amp;quot;5.2.0&amp;quot; duration=&amp;quot;0.00477600097656&amp;quot;&amp;gt;[1,2,3]&amp;lt;/return&amp;gt;
		&amp;lt;return version=&amp;quot;5.2.1&amp;quot; duration=&amp;quot;0.00473999977112&amp;quot;&amp;gt;[1,2,3]&amp;lt;/return&amp;gt;
		&amp;lt;return version=&amp;quot;5.2.2&amp;quot; duration=&amp;quot;0.00473594665527&amp;quot;&amp;gt;[1,2,3]&amp;lt;/return&amp;gt;
		&amp;lt;return version=&amp;quot;5.2.3&amp;quot; duration=&amp;quot;0.00478887557983&amp;quot;&amp;gt;[1,2,3]&amp;lt;/return&amp;gt;

		&amp;lt;return version=&amp;quot;5.2.4&amp;quot; duration=&amp;quot;0.00479698181152&amp;quot;&amp;gt;[1,2,3]&amp;lt;/return&amp;gt;
		&amp;lt;return version=&amp;quot;5.2.5&amp;quot; duration=&amp;quot;0.00476408004761&amp;quot;&amp;gt;[1,2,3]&amp;lt;/return&amp;gt;
		&amp;lt;return version=&amp;quot;5.2.6&amp;quot; duration=&amp;quot;0.00474905967712&amp;quot;&amp;gt;[1,2,3]&amp;lt;/return&amp;gt;
		&amp;lt;return version=&amp;quot;5.2.8&amp;quot; duration=&amp;quot;0.00475907325745&amp;quot;&amp;gt;[1,2,3]&amp;lt;/return&amp;gt;
		&amp;lt;return version=&amp;quot;5.2.9&amp;quot; duration=&amp;quot;0.00477600097656&amp;quot;&amp;gt;[1,2,3]&amp;lt;/return&amp;gt;
		&amp;lt;return version=&amp;quot;5.3-dev&amp;quot; duration=&amp;quot;0.00535202026367&amp;quot;&amp;gt;[1,2,3]&amp;lt;/return&amp;gt;

		&amp;lt;return version=&amp;quot;6.0-dev&amp;quot; duration=&amp;quot;0.00893187522888&amp;quot;&amp;gt;[1,2,3]&amp;lt;/return&amp;gt;
	&amp;lt;/results&amp;gt;
&amp;lt;/response&amp;gt;

http://livephp.net/functions/json_decode/\[1,2,3]?version=all

&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; ?&amp;gt;

&amp;lt;response&amp;gt;
	&amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt;
	&amp;lt;message&amp;gt;success&amp;lt;/message&amp;gt;
	&amp;lt;results&amp;gt;
		&amp;lt;return version=&amp;quot;4.4.9&amp;quot; duration=&amp;quot;0.00359201431274&amp;quot;&amp;gt;Error: Function 'json_decode' does not exist in PHP version '4.4.9'&amp;lt;/return&amp;gt;
		&amp;lt;return version=&amp;quot;5.0.5&amp;quot; duration=&amp;quot;0.00375604629517&amp;quot;&amp;gt;Error: Function 'json_decode' does not exist in PHP version '5.0.5'&amp;lt;/return&amp;gt;

		&amp;lt;return version=&amp;quot;5.1.0&amp;quot; duration=&amp;quot;0.00430989265442&amp;quot;&amp;gt;Error: Function 'json_decode' does not exist in PHP version '5.1.0'&amp;lt;/return&amp;gt;
		&amp;lt;return version=&amp;quot;5.1.6&amp;quot; duration=&amp;quot;0.00447916984558&amp;quot;&amp;gt;Error: Function 'json_decode' does not exist in PHP version '5.1.6'&amp;lt;/return&amp;gt;
		&amp;lt;return version=&amp;quot;5.2.0&amp;quot; duration=&amp;quot;0.00474095344543&amp;quot;&amp;gt;array (
  0 =&amp;gt; 1,
  1 =&amp;gt; 2,
  2 =&amp;gt; 3,
)&amp;lt;/return&amp;gt;
		&amp;lt;return version=&amp;quot;5.2.1&amp;quot; duration=&amp;quot;0.00470018386841&amp;quot;&amp;gt;array (
  0 =&amp;gt; 1,
  1 =&amp;gt; 2,
  2 =&amp;gt; 3,
)&amp;lt;/return&amp;gt;
		&amp;lt;return version=&amp;quot;5.2.2&amp;quot; duration=&amp;quot;0.00474286079407&amp;quot;&amp;gt;array (
  0 =&amp;gt; 1,
  1 =&amp;gt; 2,
  2 =&amp;gt; 3,
)&amp;lt;/return&amp;gt;
		&amp;lt;return version=&amp;quot;5.2.3&amp;quot; duration=&amp;quot;0.00478100776672&amp;quot;&amp;gt;array (
  0 =&amp;gt; 1,
  1 =&amp;gt; 2,
  2 =&amp;gt; 3,
)&amp;lt;/return&amp;gt;

		&amp;lt;return version=&amp;quot;5.2.4&amp;quot; duration=&amp;quot;0.00489497184753&amp;quot;&amp;gt;array (
  0 =&amp;gt; 1,
  1 =&amp;gt; 2,
  2 =&amp;gt; 3,
)&amp;lt;/return&amp;gt;
		&amp;lt;return version=&amp;quot;5.2.5&amp;quot; duration=&amp;quot;0.00485587120056&amp;quot;&amp;gt;array (
  0 =&amp;gt; 1,
  1 =&amp;gt; 2,
  2 =&amp;gt; 3,
)&amp;lt;/return&amp;gt;
		&amp;lt;return version=&amp;quot;5.2.6&amp;quot; duration=&amp;quot;0.00483107566833&amp;quot;&amp;gt;array (
  0 =&amp;gt; 1,
  1 =&amp;gt; 2,
  2 =&amp;gt; 3,
)&amp;lt;/return&amp;gt;
		&amp;lt;return version=&amp;quot;5.2.8&amp;quot; duration=&amp;quot;0.0047619342804&amp;quot;&amp;gt;array (
  0 =&amp;gt; 1,
  1 =&amp;gt; 2,
  2 =&amp;gt; 3,
)&amp;lt;/return&amp;gt;
		&amp;lt;return version=&amp;quot;5.2.9&amp;quot; duration=&amp;quot;0.00485610961914&amp;quot;&amp;gt;array (
  0 =&amp;gt; 1,
  1 =&amp;gt; 2,
  2 =&amp;gt; 3,
)&amp;lt;/return&amp;gt;
		&amp;lt;return version=&amp;quot;5.3-dev&amp;quot; duration=&amp;quot;0.00533699989319&amp;quot;&amp;gt;array (
  0 =&amp;gt; 1,
  1 =&amp;gt; 2,
  2 =&amp;gt; 3,
)&amp;lt;/return&amp;gt;

		&amp;lt;return version=&amp;quot;6.0-dev&amp;quot; duration=&amp;quot;0.00902605056763&amp;quot;&amp;gt;array (
  0 =&amp;gt; 1,
  1 =&amp;gt; 2,
  2 =&amp;gt; 3,
)&amp;lt;/return&amp;gt;
	&amp;lt;/results&amp;gt;
&amp;lt;/response&amp;gt;

&lt;/pre&gt;


&lt;p&gt;A quand un tel service intégrer à la documentation en ligne de PHP.net&amp;nbsp;? ;)&lt;/p&gt;


&lt;p&gt;Bonne utilisation&lt;/p&gt;


&lt;p&gt;PS: vous souhaitez voir d'autres fonctionnalités&amp;nbsp;? Envoyer un email à features@livephp.net&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.phppro.fr/?post/2009/05/18/LivePHPnet-%3A-tester-les-differentes-versions-de-PHP#comment-form</comments>
      <wfw:comment>http://blog.phppro.fr/?post/2009/05/18/LivePHPnet-%3A-tester-les-differentes-versions-de-PHP#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.phppro.fr/?feed/atom/comments/39</wfw:commentRss>
      </item>
    
  <item>
    <title>PHP Tree Match : Vérifiez que vos arborescences projets sont standardisées !</title>
    <link>http://blog.phppro.fr/?post/2009/05/11/PHP-Tree-Match-%3A-Verifiez-que-vos-arborescence-projets-sont-standardisees</link>
    <guid isPermaLink="false">urn:md5:3fbc6478949245d5e81878deda6cf58e</guid>
    <pubDate>Mon, 11 May 2009 18:41:00 +0100</pubDate>
    <dc:creator>Olivier Hoareau</dc:creator>
        <category>Outillage</category>
            
    <description>&lt;p&gt;&quot;Et alors, mes 18 projets ont tous la même arborescence&amp;nbsp;? Ils sont tous standard (i.e. respectent &quot;nos&quot; standards) et sont tous &quot;faits&quot; de la même façon ?&quot;
Certains d'entre vous se sont déjà vus poser cette question&amp;nbsp;? Si, c'est la cas, PHP Tree Match pourra probablement vous aider...&lt;/p&gt;    &lt;p&gt;PHP Tree Match, ou PHPTM de son petit nom, est un nouvel outil &quot;basique&quot; (dans la série des phpcpd, phpmd...) qui permet de vérifier que l'arborescence de votre/vos projets respectent bien une norme que vous vous donnez.
Par exemple, vous avez l'habitude mettre une arborescence du type&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
/
    application/
        default/
            controllers/
            models/
            views/
    config/
         application.ini
    html/
        index.php
        .htaccess
    ...
&lt;/pre&gt;


&lt;p&gt;Vous devez gérer 1, 5, 10 ... projets similaires et vous voulez vérifier d'un seul coup que tous vos projets respectent bien vos conventions, que le fichier config/application.ini contient bien la section &quot;&lt;a href=&quot;http://blog.phppro.fr/?post/2009/05/11/production&quot; title=&quot;production&quot;&gt;production&lt;/a&gt;&quot;, que le fichier .project n'existe pas en prod...&lt;/p&gt;


&lt;h2&gt;Installation&lt;/h2&gt;


&lt;h3&gt;à partir du Channel PEAR&lt;/h3&gt;

&lt;pre&gt;
$ pear channel-discover pear.phppro.fr
$ pear install phppro/phptm
&lt;/pre&gt;


&lt;h3&gt;mise à jour&lt;/h3&gt;

&lt;pre&gt;
$ pear upgrade phppro/phptm
&lt;/pre&gt;


&lt;h3&gt;à partir du package compatible PEAR en téléchargement sur Google Code&lt;/h3&gt;

&lt;pre&gt;
$ wget http://phptreematch.googlecode.com/files/phptm-0.1.0.tgz
$ pear install phptm-0.1.0.tgz
&lt;/pre&gt;


&lt;h2&gt;Usage&lt;/h2&gt;


&lt;p&gt;Avant d'utiliser phptm vous devez &quot;décrire&quot; votre arborescence projet dans un fichier de description au format xml. Voici un exemple&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;
&amp;lt;tree&amp;gt;
    &amp;lt;item name=&amp;quot;.project&amp;quot; present=&amp;quot;false&amp;quot;/&amp;gt;
    &amp;lt;item name=&amp;quot;bin/phptm.bat&amp;quot; hash=&amp;quot;8c8d25cde4142e4b945792c2ca9a31cc&amp;quot;/&amp;gt;
    &amp;lt;item name=&amp;quot;bin/phptm.php&amp;quot; hash=&amp;quot;635f67483f575310a904c02a2068d0dd&amp;quot;/&amp;gt;
    &amp;lt;item name=&amp;quot;build/package.xml&amp;quot; hash=&amp;quot;ca34d98facbc5ff461976d5f18910cbe&amp;quot;/&amp;gt;
    &amp;lt;item name=&amp;quot;build.xml&amp;quot; hash=&amp;quot;a25ebe507f99623d266aeee4d1ed4463&amp;quot;/&amp;gt;
    &amp;lt;item name=&amp;quot;config/build.properties&amp;quot;&amp;gt;
        &amp;lt;contains&amp;gt;version=&amp;lt;/contains&amp;gt;
        &amp;lt;contains&amp;gt;name=&amp;lt;/contains&amp;gt;
    &amp;lt;/item&amp;gt;
    &amp;lt;item name=&amp;quot;config/package.xml&amp;quot;/&amp;gt;
    &amp;lt;item name=&amp;quot;docs/README.markdown&amp;quot;/&amp;gt;
    &amp;lt;item name=&amp;quot;library/PHPTM/Analyzer.php&amp;quot;/&amp;gt;
    &amp;lt;item name=&amp;quot;library/PHPTM/Log/XML/XML.php&amp;quot;/&amp;gt;
    &amp;lt;item name=&amp;quot;library/PHPTM/Log/XML.php&amp;quot;/&amp;gt;
    &amp;lt;item name=&amp;quot;library/PHPTM/TextUI/Command.php&amp;quot;/&amp;gt;
    &amp;lt;item name=&amp;quot;library/PHPTM/TextUI/Getopt.php&amp;quot;/&amp;gt;
    &amp;lt;item name=&amp;quot;library/PHPTM/TextUI/ResultPrinter.php&amp;quot;/&amp;gt;
    &amp;lt;item name=&amp;quot;library/PHPTM/Util/FilterIterator.php&amp;quot;/&amp;gt;
&amp;lt;/tree&amp;gt;
&lt;/pre&gt;


&lt;p&gt;Le fichier ci-dessus permet notamment de vérifier que certains fichier sont bien absent(present=false), que certains fichiers existent et ont un contenu précis (calculé à partir de &quot;hash&quot;), que certains fichiers existent et contiennent une chaîne de caractère précise (&quot;contains&quot;, mais vous pouvez aussi utiliser &quot;notcontains&quot;)...&lt;/p&gt;


&lt;p&gt;Inspirez vous de l'exemple ci-dessus pour construire votre fichier de description, ou bien exécutez la commande suivante sur une arborescence type&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
$ phptm --build-tree my-typical-directory &amp;gt; typical-tree.xml
&lt;/pre&gt;


&lt;p&gt;Pour &quot;passer&quot; ensuite phptm sur votre application, exécutez&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
$ phptm --expected-tree=typical-tree.xml my-directory
&lt;/pre&gt;


&lt;p&gt;ou bien pour exporter aussi le résultat sous forme xml&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
$ phptm --log-xml=phptm-report.xml --expected-tree=typical-tree.xml my-directory
&lt;/pre&gt;


&lt;h2&gt;Description du rapport calculé&lt;/h2&gt;


&lt;p&gt;Le rapport en ligne de commande ou bien le rapport xml vous indique alors si des erreurs de cohérences sont détectées et si oui, lesquelles&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;missing&amp;nbsp;: absence de fichier listé&lt;/li&gt;
&lt;li&gt;present&amp;nbsp;: présence de fichier listé comme devant être absent&lt;/li&gt;
&lt;li&gt;hash&amp;nbsp;: contenu de fichier non identique à celui attendu&lt;/li&gt;
&lt;li&gt;contains&amp;nbsp;: fichier contenant une chaîne marquée comme devant ne pas être dans le fichier&lt;/li&gt;
&lt;li&gt;not-contains&amp;nbsp;: fichier ne contenant pas une chaîne attendue&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Limitations&lt;/h2&gt;


&lt;p&gt;PHPTM est loin d'être un outil parfait et exhaustif, n'hésitez pas à remonter des éventuels bugs et des demandes d'évolutions sur l'espace du projet sur Google Code &lt;a href=&quot;http://code.google.com/p/phptreematch/issues/list&quot;&gt;http://code.google.com/p/phptreematch/issues/list&lt;/a&gt;&amp;nbsp;! ou à partir la documentation sur &lt;a href=&quot;http://code.google.com/p/phptreematch&quot;&gt;http://code.google.com/p/phptreematch&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;
&lt;strong&gt;Bonne utilisation !&lt;/strong&gt;&lt;br /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.phppro.fr/?post/2009/05/11/PHP-Tree-Match-%3A-Verifiez-que-vos-arborescence-projets-sont-standardisees#comment-form</comments>
      <wfw:comment>http://blog.phppro.fr/?post/2009/05/11/PHP-Tree-Match-%3A-Verifiez-que-vos-arborescence-projets-sont-standardisees#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.phppro.fr/?feed/atom/comments/37</wfw:commentRss>
      </item>
    
  <item>
    <title>PHP Code Ratio : calculez le ratio de commentaires dans vos fichiers !</title>
    <link>http://blog.phppro.fr/?post/2009/05/05/PHP-Code-Ratio-%3A-calculez-le-ratio-de-commentaires-dans-vos-fichiers</link>
    <guid isPermaLink="false">urn:md5:5f6702ccd96ae3e800a27f9601aa7d46</guid>
    <pubDate>Tue, 05 May 2009 11:23:00 +0100</pubDate>
    <dc:creator>Olivier Hoareau</dc:creator>
        <category>Outillage</category>
        <category>métrique</category><category>outils</category>    
    <description>&lt;p&gt;&quot;Et alors, quel est le pourcentage de commentaires dans mon appli ?&quot;
Certains d'entre vous se sont déjà vus poser cette question&amp;nbsp;? Si, c'est la cas, PHP Code Ratio pourra probablement vous aider...&lt;/p&gt;    &lt;p&gt;PHP Code Ratio, ou PHPCR de son petit nom, est un nouvel outil &quot;basique&quot; (dans la série des phpcpd, phpmd...) qui permet de connaître le pourcentage de commentaire dans vos fichiers php.&lt;/p&gt;


&lt;h2&gt;Installation&lt;/h2&gt;


&lt;h3&gt;à partir du Channel PEAR&lt;/h3&gt;

&lt;pre&gt;
$ pear channel-discover pear.phppro.fr
$ pear install phppro/phpcr
&lt;/pre&gt;


&lt;h3&gt;mise à jour&lt;/h3&gt;

&lt;pre&gt;
$ pear upgrade phppro/phpcr
&lt;/pre&gt;


&lt;h3&gt;à partir du package compatible PEAR en téléchargement sur Google Code&lt;/h3&gt;

&lt;pre&gt;
$ wget http://phpcoderatio.googlecode.com/files/phpcr-0.1.0.tgz
$ pear install phpcr-0.1.0.tgz
&lt;/pre&gt;


&lt;h2&gt;Usage&lt;/h2&gt;


&lt;p&gt;Pour &quot;passer&quot; phpcr sur votre application, exécutez&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
$ phpcr my-directory
&lt;/pre&gt;


&lt;p&gt;ou bien pour exporter aussi le résultat sous forme xml&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
$ phpcr --log-xml=phpcr-report.xml my-directory
&lt;/pre&gt;


&lt;h2&gt;Description des métriques calculées&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Metrique 'code'&amp;nbsp;: pourcentage de code php sans les espaces, sans les commentaires et sans le HTML &quot;inline&quot;&lt;/li&gt;
&lt;li&gt;Metrique 'code-with-space'&amp;nbsp;: pourcentage de code php avec les espaces mais sans commentaires et sans HTML &quot;inline&quot;&lt;/li&gt;
&lt;li&gt;Metrique 'code-with-space-and-html'&amp;nbsp;: pourcentage de code php avec espaces, HTML &quot;inline&quot; mais sans commentaire&lt;/li&gt;
&lt;li&gt;Metrique 'html'&amp;nbsp;: pourcentage de HTML &quot;inline&quot; dans les fichiers PHP&lt;/li&gt;
&lt;li&gt;Metrique 'whitespace'&amp;nbsp;: pourcentage d'espace dans les fichiers php&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Extensions parsées&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;php&lt;/li&gt;
&lt;li&gt;php3&lt;/li&gt;
&lt;li&gt;php4&lt;/li&gt;
&lt;li&gt;php5&lt;/li&gt;
&lt;li&gt;phtml&lt;/li&gt;
&lt;li&gt;inc&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;mais vous pouvez modifier cette liste en utilisant le paramètre ligne de commande &quot;--suffixes=&quot;&lt;/p&gt;


&lt;h2&gt;Limitations&lt;/h2&gt;


&lt;p&gt;PHPCR est loin d'être un outil parfait et exhaustif, n'hésitez pas à remonter des éventuels bugs et des demandes d'évolutions sur l'espace du projet sur Google Code &lt;a href=&quot;http://code.google.com/p/phpcoderatio/issues/list&quot;&gt;http://code.google.com/p/phpcoderatio/issues/list&lt;/a&gt;&amp;nbsp;! ou à partir la documentation sur &lt;a href=&quot;http://code.google.com/p/phpcoderatio&quot;&gt;http://code.google.com/p/phpcoderatio&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;
&lt;strong&gt;Bonne utilisation !&lt;/strong&gt;&lt;br /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.phppro.fr/?post/2009/05/05/PHP-Code-Ratio-%3A-calculez-le-ratio-de-commentaires-dans-vos-fichiers#comment-form</comments>
      <wfw:comment>http://blog.phppro.fr/?post/2009/05/05/PHP-Code-Ratio-%3A-calculez-le-ratio-de-commentaires-dans-vos-fichiers#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.phppro.fr/?feed/atom/comments/36</wfw:commentRss>
      </item>
    
  <item>
    <title>Pourquoi Eclipse et les annotations ont révolutionné ma façon de coder</title>
    <link>http://blog.phppro.fr/?post/2009/04/20/Pourquoi-Eclipse-et-les-annotations-ont-revolutionne-ma-facon-de-coder</link>
    <guid isPermaLink="false">urn:md5:5b9626aee0911b0724781b8a047b35ee</guid>
    <pubDate>Tue, 21 Apr 2009 08:55:00 +0100</pubDate>
    <dc:creator>Olivier Hoareau</dc:creator>
        <category>Outillage</category>
        <category>annotation</category><category>build</category><category>eclipse</category><category>factory</category><category>pattern</category><category>refactoring</category><category>zend studio</category>    
    <description>&lt;p&gt;Comme beaucoup d'entre vous, &quot;vi&quot; (prononcez &quot;vi-aille&quot;) a longtemps été mon ami pour développer mon code PHP.&lt;br /&gt;
Il me plaisait bien, j'avais l'air d'être un geek et tout allait bien.&lt;br /&gt;&lt;/p&gt;    &lt;p&gt;Et puis il y a quelques temps (2-3 ans), j'ai du travailler chez un client avec Eclipse + Plugin PHP (que je connaissais en Java mais qui ne m'attirait pas à l'époque pour PHP au vu du peu de fonctionnalités que je pensais disponible pour cette plateforme).&lt;br /&gt;
Ce type d'outils généère un bloc de commentaire au dessus d'une fonction ou méthode quand on en créé une (après le passage à la ligne par l'appui sur la touche entrée).&lt;br /&gt;
J'ai vu qu'il rajoutait des annotations ou doclet&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
/**
 * ...
 * 
 * @return unknown
 */
&lt;/pre&gt;


&lt;p&gt;Je me suis dit que j'allais alors remplacer unknown par le type retourné quand il s'agissait d'un objet, par exemple&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
/**
 * ...
 * 
 * @return Sms
 */
&lt;/pre&gt;


&lt;p&gt;(en ce temps là, j'avais encore le temps de perdre mon temps à faire des choses d'apparences inutiles dans le code...).&lt;br /&gt;
Jusque là, rien de transcendant. Et puis dans un autre fichier, j'ai utilisé ma méthode nouvellement créé, et là, surprise&amp;nbsp;! Eclipse me propose une autocomplétion avec la liste de toutes les méthodes de la classe Sms&amp;nbsp;! Cool !&lt;br /&gt;
Je me suis dit alors que j'allais essayer de systématiquement mettre les @return, et que ca m'aiderait à aller plus vite (plutôt que de chercher le nom des méthodes dispos en switchant entre les fichiers).&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Puis je remarque aussi qu'il me met des @param au-dessus des méthodes / fonctions, pour décrire les paramètres de mes fonctions.&lt;br /&gt;&lt;/p&gt;

&lt;pre&gt;
/**
 * ...
 * 
 * @param unknown $sms
 * @param unknown $xmlelement
 *
 * ...
 */
&lt;/pre&gt;


&lt;p&gt;Je décide alors d'essayer de mettre des types, par exemple&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
/**
 * ...
 * 
 * @param Sms $sms le sms à envoyer
 * @param SimpleXMLElement $xmlelement le document xml
 *
 * ...
 */
&lt;/pre&gt;


&lt;p&gt;Et je me rends compte qu'il m'indique ces types dans l'autocompletion, ce qui m'aide dans de nombreux cas pour savoir quoi passer à la fonction / méthode.&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Par contre, j'ai souvent plein de méthodes qui ne renvoient rien, donc je ne bénéficie d'aucune complétion automatique dans ces cas là.&lt;br /&gt;
Je me dis alors, et si je renvoyait $this ?&lt;br /&gt;
Je mets alors des&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
...
{
    ...
    return $this;
}
&lt;/pre&gt;


&lt;p&gt;à la fin de chaque méthode qui n'est pas censée renvoyer un résultat (par exemple les setters !) et je rajoute l'annotation @return &amp;lt;la-classe-de-$this&amp;gt;.&lt;br /&gt;
Du coup, je peux chainer certains de mes appels&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
$sms = new Sms();
$sms-&amp;gt;setSender(...)
          -&amp;gt;addRecipient(...)
          -&amp;gt;addRecipient(...)
          -&amp;gt;setMessage(...)
          -&amp;gt;send();
&lt;/pre&gt;


&lt;p&gt;Cool&amp;nbsp;! Pas mal, mon code devient plus concis et du coup, j'essaye de nommer mes méthodes pour que leur &quot;enchainement&quot; soit compréhensible et lisible. En plus, j'ai l'auto-complétion pour chacune des lignes grâce à mon @return !&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;La cerise sur le gâteau&amp;nbsp;: j'utilise alors le pattern Factory (avec une méthode statique)&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
    /**
      * Returns a new instance of this class
      *
      * @return Sms
      */
    public final static function getInstance()
    {
        return new self;
    }
&lt;/pre&gt;


&lt;p&gt;Ce qui me permet de simplifier encore mon utilisation de mes classes&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
Sms::getInstance()
    -&amp;gt;setSender(...)
    -&amp;gt;addRecipient(...)
    -&amp;gt;addRecipient(...)
    -&amp;gt;setMessage(...)
    -&amp;gt;send();
&lt;/pre&gt;


&lt;p&gt;On pourrait même mettre tout sur une ligne&amp;nbsp;! (attention à la lisibilité).&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Si je résume, grâce à Eclipse et aux annotations&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;j'ai tendance à utiliser plutôt les structures objet pour avoir l'auto-complétion (plutôt que de multiple paramètre string)&lt;/li&gt;
&lt;li&gt;je fais des return $this systématiques pour les méthodes qui ne renvoient rien&lt;/li&gt;
&lt;li&gt;j'ai simplifié et rendu plus lisible les noms de mes méthodes pour qu'elles s'inscrivent harmonieusement dans un enchainement&lt;/li&gt;
&lt;li&gt;j'ai typé mes paramètres de fonctions / méthodes ce qui me permet d'avoir l'auto-complétion sur les paramètres dans mes fonctions&lt;/li&gt;
&lt;li&gt;je crée quasi systématiquement des factories pour éviter de passer par une variable inutile&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Une vraie révolution, à l'époque, pour moi !&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Et vous, quels sont les petits trucs qui ont révolutionné votre manière de coder&amp;nbsp;?&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.phppro.fr/?post/2009/04/20/Pourquoi-Eclipse-et-les-annotations-ont-revolutionne-ma-facon-de-coder#comment-form</comments>
      <wfw:comment>http://blog.phppro.fr/?post/2009/04/20/Pourquoi-Eclipse-et-les-annotations-ont-revolutionne-ma-facon-de-coder#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.phppro.fr/?feed/atom/comments/32</wfw:commentRss>
      </item>
    
  <item>
    <title>Points de contrôle automatisés avant un développement ou comment maîtriser un déploiement</title>
    <link>http://blog.phppro.fr/?post/2009/01/23/Points-de-controle-automatises-avant-un-developpement-ou-comment-maitriser-un-deploiement</link>
    <guid isPermaLink="false">urn:md5:c4362d5ba30bd70a96e18c053f919bb7</guid>
    <pubDate>Fri, 23 Jan 2009 08:51:00 +0000</pubDate>
    <dc:creator>Olivier Hoareau</dc:creator>
        <category>Outillage</category>
        <category>environnement</category><category>integration</category><category>tests</category>    
    <description>&lt;p&gt;Vous avez une mise en production hyper importante aujourd'hui. Votre client (interne) vous a mis la pression et vous avez dû raccourcir les délais pour être à l'heure.
Vous packagez votre release d'application, vous la passez sur l'environnement de tests fonctionnels, tout se passe bien.
Vous la passez sur l'environnement d'intégration et tout se passe bien, mais vous noter un ou deux comportement étrange, sans gravité, bizarre.
Vous décidez de la passer en pré-production, et là ... Tout plante&amp;nbsp;! L'application ne se lance même plus et c'est la page blanche...&lt;/p&gt;    &lt;p&gt;Vous avez une mise en production hyper importante aujourd'hui. Votre client (interne) vous a mis la pression et vous avez dû raccourcir les délais pour être à l'heure.
Vous packagez votre release d'application, vous la passez sur l'environnement de tests fonctionnels, tout se passe bien.
Vous la passez sur l'environnement d'intégration et tout se passe bien, mais vous noter un ou deux comportement étrange, sans gravité, bizarre.
Vous décidez de la passer en pré-production, et là ... Tout plante&amp;nbsp;! L'application ne se lance même plus et c'est la page blanche...&lt;/p&gt;


&lt;p&gt;Pourquoi&amp;nbsp;?&lt;/p&gt;


&lt;p&gt;Vous investiguez et vous découvrez que l'environnement de pré-production n'est absolument pas à jour (choisissez une ou plusieurs lignes dans la liste)&amp;nbsp;:&lt;/p&gt;


&lt;p&gt;- mauvaise version de PHP&lt;/p&gt;


&lt;p&gt;- mauvaise version de votre framework MVC habituel&lt;/p&gt;


&lt;p&gt;- mauvaise version de votre librairie de composants interne partagée&lt;/p&gt;


&lt;p&gt;- extension SOAP manquante&lt;/p&gt;


&lt;p&gt;- répertoire de log inexistant sur la machine (votre application ne le crée pas si il n'existe pas...)&lt;/p&gt;


&lt;p&gt;- connexion à la base de données non fonctionnelle car les identifiants ont changé...&lt;/p&gt;


&lt;p&gt;- ...&lt;/p&gt;



&lt;p&gt;La catastrophe.&lt;/p&gt;


&lt;p&gt;Vous décidez donc de regarder sur la machine de production, et bien sûr vous faites les mêmes découvertes...&lt;/p&gt;


&lt;p&gt;Résultat: votre mise en production est décalée de 1/2 journée, vous mettez la pression aux équipes plateformes pour qu'elles mettent tous les environnements à jour, et vous prenez un savon par votre client (interne) qui vous prend pour un amateur.&lt;/p&gt;


&lt;p&gt;Comment éviter cela&amp;nbsp;?&lt;/p&gt;


&lt;p&gt;Vous pouvez acheter le dernier outils à la mode qui compte XXXX k€ et qui vérifie tout, mais c'est long à mettre en place et surtout ca coûte très cher dans votre budget (ou celui des équipes plateformes), en plus les tests réalisés seront soit très générique soit il faudra peut être un peu tordre l'outils pour faire certaines vérifications un peu spécifique à votre application (test de la connexion mysql, vérification de la version de votre framework préféré...)&lt;/p&gt;


&lt;p&gt;Une autre solution consiste à réaliser un petit script, PHP, qui va faire tous les tests spécifiques qui vous intéresse et vous faire un rapport directe. Appellons le &quot;PHP Sanity Check(er)&quot;.&lt;/p&gt;


&lt;p&gt;Une contrainte cependant&amp;nbsp;: tout doit tenir dans un script (1 fichier) et aucune installation ou dépendance autre que le dépôt du fichier dans l'arborescence du serveur web ne doit être nécessaire. En effet, il serait dommage que votre script ne fonctionne qu'avec une dépendance à la librairie TUTU et que cette librairie ne soit pas installée sur la plateforme (qui le vérifierait ?)&lt;/p&gt;


&lt;p&gt;Le script peut être très simple et faire une série de version_compare(), de stream_socket_client(), de file_exists(), extension_loaded(), de vérification de variable $_SERVER.... c'est du PHP, vous pouvez donc tout faire ;), par contre, avant d'utiliser mysql(i)_connect, vérifiez (via un test dans le script) que l'extension mysql(i) est bien chargée&amp;nbsp;!&lt;/p&gt;


&lt;p&gt;Oui mais j'ai plusieurs applications croisées avec plusieurs environnements, ce qui m'oblige à faire des suites de tests différentes, comment faire&amp;nbsp;? je duplique le script pour chacun des cas et je maintiens les différentes versions&amp;nbsp;? une usine à gaz&amp;nbsp;!&lt;/p&gt;


&lt;p&gt;Non.&lt;/p&gt;


&lt;p&gt;Vous êtes malin.&lt;/p&gt;


&lt;p&gt;Vous développez donc une seule fois, vous faites des fichiers de configuration spécifiques à chacun des applications/environnements et &quot;vous générez un script spécifique pour chacun des cas&quot;.&lt;/p&gt;


&lt;p&gt;Comment&amp;nbsp;?&lt;/p&gt;


&lt;p&gt;Grâce, par exemple à Phing et Phar.&lt;/p&gt;


&lt;p&gt;Vous créez votre script générique qui prend une liste de tests écrit dans un fichier de configuration (par exemple xml). Voici un exemple de fichier&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
&amp;lt;?xml version='1.0' encoding='iso-8859-1' ?&amp;gt;

&amp;lt;psc&amp;gt;
	&amp;lt;test info=&amp;quot;PHP Version&amp;quot; type=&amp;quot;php:minimum-version&amp;quot; arg1=&amp;quot;5.0.0&amp;quot;/&amp;gt;
	&amp;lt;test info=&amp;quot;Windows Platform&amp;quot; type=&amp;quot;php:os&amp;quot; arg1=&amp;quot;winnt&amp;quot;/&amp;gt;
	&amp;lt;test info=&amp;quot;Google is Reachable&amp;quot; type=&amp;quot;network:tcp-port-reachable&amp;quot; arg1=&amp;quot;www.google.com&amp;quot; arg2=&amp;quot;80&amp;quot;/&amp;gt;
&amp;lt;/psc&amp;gt;
&lt;/pre&gt;


&lt;p&gt;Votre script lit le contenu du fichier xml, en sort une liste de tests correspondant à des appels de méthodes de classes&amp;nbsp;:&lt;/p&gt;


&lt;p&gt;- Php::checkMinimumVersion('5.0.0')&lt;/p&gt;


&lt;p&gt;- Php::checkOs('winnt')&lt;/p&gt;


&lt;p&gt;- Network::checkTcpPortReachable('www.google.com','80')&lt;/p&gt;



&lt;p&gt;Vous écrivez ensuite les classes Php (dans Php.php ;)) et Network (dans Network.php) qui contiennent chacunes les méthodes listées, vous pouvez bien sûr en rajouter d'autres, si elles ne sont pas listées dans le fichier de configuration elle ne seront pas utilisées.&lt;/p&gt;


&lt;p&gt;Vous faites en sorte que chacune des méthodes lève une exception si le test ne passe pas avec un message d'erreur compréhensible sur le problème.&lt;/p&gt;


&lt;p&gt;A l'exécution, vous récupérez le résultat d'exécution de chacune des méthodes (en faisant un try/catch par dessus) et vous affichez cela dans un tableau HTML qui va bien avec des couleurs verte et rouge.&lt;/p&gt;


&lt;p&gt;Mais à quoi sert Phar&amp;nbsp;?&lt;/p&gt;


&lt;p&gt;Venons-en à Phar. Phar ou encore &quot;PHP Archive&quot; permet de condenser plusieurs scripts PHP dans un seul fichier (.phar), il peut être compressé ou non. Le moteur PHP saura exécuter le fichier .phar comme si il était un script .php
La seule différence est que le .phar contenant plusieurs fichiers php, il faut lui indiquer précisément quel est le premier script a exécuter (celui-ci pourra faire des includes des autres éventuellement).&lt;/p&gt;


&lt;p&gt;Vous pouvez donc faire plein de fichiers/scripts/classes dans votre outils et les packager dans un seul et même fichier .phar en y embarquant même le fichier de configuration nécessaire. A l'exécution, vos scripts se comporteront comme si ils étaient dans un répertoire sur le disque et vous pourrez utiliser les includes.&lt;/p&gt;


&lt;p&gt;Mais à quoi sert Phing&amp;nbsp;?&lt;/p&gt;


&lt;p&gt;Phing, est un outils de scripting cross-platform (xml) écrit en PHP (port de Ant venant de Java). Il permet de décrir des batchs de commandes (systèmes souvent) à réaliser sous forme xml (ca marche donc sous windows, mac, linux...), voici ce que nous pourrions faire pour packager notre PHP sanity Checker pour générer un .phar à installer sur les plateformes pour notre application TOTO&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
    &amp;lt;target name=&amp;quot;package&amp;quot; depends=&amp;quot;init&amp;quot; description=&amp;quot;Packages the phar script to deploy on platform (use -Dsuite=&amp;lt;your-suite&amp;gt;)&amp;quot;&amp;gt;
    	&amp;lt;delete dir=&amp;quot;tmp/package&amp;quot;/&amp;gt;
    	&amp;lt;mkdir dir=&amp;quot;tmp/package&amp;quot;/&amp;gt;
    	&amp;lt;mkdir dir=&amp;quot;tmp/package/config/suites&amp;quot;/&amp;gt;
    	&amp;lt;copy file=&amp;quot;config/suites/${suite}.xml&amp;quot; tofile=&amp;quot;tmp/package/config/suites/default.xml&amp;quot;/&amp;gt;
    	&amp;lt;copy todir=&amp;quot;tmp/package&amp;quot;&amp;gt;
    		&amp;lt;fileset dir=&amp;quot;.&amp;quot;&amp;gt;
    			&amp;lt;include name=&amp;quot;**/*.php&amp;quot;/&amp;gt;
    		&amp;lt;/fileset&amp;gt;
    	&amp;lt;/copy&amp;gt;
    	&amp;lt;phar to=&amp;quot;tmp/check.phar&amp;quot;&amp;gt;
    		&amp;lt;fileset dir=&amp;quot;tmp/package&amp;quot;&amp;gt;
    			&amp;lt;include name=&amp;quot;**/*&amp;quot;/&amp;gt;
    		&amp;lt;/fileset&amp;gt;
    	&amp;lt;/phar&amp;gt;
    &amp;lt;/target&amp;gt;
&lt;/pre&gt;


&lt;p&gt;Pour exécuter cette liste de commandes, vous faites&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
$ phing package -Dsuite=mon-application
&lt;/pre&gt;


&lt;p&gt;ce qui aura pour but de packager le fichier mon-application.xml avec vos scripts php (ceux de votre outils de tests) dans un fichier tmp/check.phar.&lt;/p&gt;


&lt;p&gt;Dernière étape, vous déployez (vous copiez) le fichier check.phar sur votre plateforme cible dans l'arborescence du serveur web, et vous accédez à ce fichier comme si il s'agissait d'un fichier .php (configurer apache pour qu'il traite les fichiers .phar comme les fichiers .php).&lt;/p&gt;


&lt;p&gt;Des commentaires&amp;nbsp;?&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.phppro.fr/?post/2009/01/23/Points-de-controle-automatises-avant-un-developpement-ou-comment-maitriser-un-deploiement#comment-form</comments>
      <wfw:comment>http://blog.phppro.fr/?post/2009/01/23/Points-de-controle-automatises-avant-un-developpement-ou-comment-maitriser-un-deploiement#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.phppro.fr/?feed/atom/comments/24</wfw:commentRss>
      </item>
    
  <item>
    <title>Code HTML/JS simplifié (sans framework) pour faire de l'ajax</title>
    <link>http://blog.phppro.fr/?post/2008/10/10/Code-HTML/JS-simplifie-sans-framework-pour-faire-de-l-ajax</link>
    <guid isPermaLink="false">urn:md5:c1e08d9ec7cd89d746a872ad727f27a3</guid>
    <pubDate>Fri, 10 Oct 2008 15:42:00 +0100</pubDate>
    <dc:creator>Olivier Hoareau</dc:creator>
        <category>Outillage</category>
        <category>ajax</category><category>javascript</category>    
    <description>&lt;p&gt;Pour des besoins internes, j'ai spiké un code html/js de quelques lignes pour faire des requêtes Ajax (POST/PUT/DELETE/GET/HEAD) en voyant par exemple du contenu xml (REST ;) )&lt;/p&gt;


&lt;p&gt;Je l'ai mis en ligne, vous pouvez récupérer à tout moment le code source (code source html) à l'adresse&amp;nbsp;: ...&lt;/p&gt;    &lt;p&gt;Pour des besoins internes, j'ai spiké un code html/js de quelques lignes pour faire des requêtes Ajax (POST/PUT/DELETE/GET/HEAD) en voyant par exemple du contenu xml (REST ;) )&lt;/p&gt;


&lt;p&gt;Je l'ai mis en ligne, vous pouvez récupérer à tout moment le code source (code source html) à l'adresse&amp;nbsp;:&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://octo.warkodev.net/ajax/&quot;&gt;http://octo.warkodev.net/ajax/&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;C'est bâteau, mais ca arrive qu'on ait besoin d'un morceaux de code de ce type rapidement sous la main.&lt;/p&gt;


&lt;p&gt;Hope this helps (même si ca remplace pas prototype, extjs et autres jquery ;) )&lt;/p&gt;


&lt;p&gt;PS: testé et fonctionnel sur FF3, IE7, GChrome&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.phppro.fr/?post/2008/10/10/Code-HTML/JS-simplifie-sans-framework-pour-faire-de-l-ajax#comment-form</comments>
      <wfw:comment>http://blog.phppro.fr/?post/2008/10/10/Code-HTML/JS-simplifie-sans-framework-pour-faire-de-l-ajax#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.phppro.fr/?feed/atom/comments/3</wfw:commentRss>
      </item>
    
  <item>
    <title>Scrinch : Outil de gestion de projet agile</title>
    <link>http://blog.phppro.fr/?post/2008/10/10/Scrinch-%3A-Outil-de-gestion-de-projet-agile</link>
    <guid isPermaLink="false">urn:md5:c89964e084a481ad4c335b2851e275cb</guid>
    <pubDate>Wed, 08 Oct 2008 15:46:00 +0100</pubDate>
    <dc:creator>Olivier Hoareau</dc:creator>
        <category>Outillage</category>
        <category>agile</category><category>equipe</category><category>projet</category>    
    <description>&lt;p&gt;Bonjour à tous amis Agilistes,&lt;/p&gt;


&lt;p&gt;Que pensez-vous de cette outils pour gérer les projets Agile&amp;nbsp;: ...&lt;/p&gt;    &lt;p&gt;Bonjour à tous amis Agilistes,&lt;/p&gt;


&lt;p&gt;Que pensez-vous de cet outil pour gérer les projets Agile&amp;nbsp;:&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://social.hortis.ch/2008/09/25/16-octobre-08-mardi-gras-sur-scrinch-outil-de-gestion-de-projet-agile/&quot;&gt;http://social.hortis.ch/2008/09/25/16-octobre-08-mardi-gras-sur-scrinch-outil-de-gestion-de-projet-agile/&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Ca ne remplace pas nos bons vieux post-it sur les murs mais cela peut-il avoir une pertinence à vos yeux pour le Product Owner et pour l'équipe.&lt;/p&gt;


&lt;p&gt;A vos plumes&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.phppro.fr/?post/2008/10/10/Scrinch-%3A-Outil-de-gestion-de-projet-agile#comment-form</comments>
      <wfw:comment>http://blog.phppro.fr/?post/2008/10/10/Scrinch-%3A-Outil-de-gestion-de-projet-agile#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.phppro.fr/?feed/atom/comments/4</wfw:commentRss>
      </item>
    
</channel>
</rss>