V. Développer avec PHPBoost

POptimizer

POptimizer (pour PHP Optimizer) est un optimiseur de code source en PHP distribué sous licence GNU/GPL. Cet outil a été développé par l'équipe de développement du noyau de PHPBoost afin d'améliorer ses performances.

Optimiser, pourquoi ? comment ?



PHP, un langage de script interprété



Bien que la plupart des cas d'utilisation de PHP n'utilisent pas le fait que ce soit un langage de script, il faut tout de même le garder à l'esprit. Contrairement à un langage compilé comme C et C++ par exemple où le code est déjà compilé en langage machine et donc directement exécutable, l'exécution d'une application écrite en langage de script se fait à chaque fois directement à partir du code source. Ainsi, par exemple sur PHPBoost, lorsqu'une page est générée, tous les fichiers source utilisés sont ouverts, lus, interprétés puis ensuite exécutés là où avec un langage compilé l'ordinateur n'aurait qu'à exécuter le fichier. La lecture et l'interprétation de chaque fichier source sont certes très optimisées, mais elles prennent un temps non négligeable.

L'enjeu



Un fichier source contient de nombreux caractères inutiles pour l'interpréteur



Les fichiers source d'une application écrite en PHP contient souvent un grand nombre de caractères qui sont ignorés lors de l'interprétation des fichiers (espaces blancs, caractères...).
Pourtant ces caractères inutiles ont une importance très grande pour le développeur. Par exemple, les commentaires sont totalement ignorés par l'interpréteur mais sont indispensables pour avoir un code clair et lisible que tout le monde puisse comprendre. De même, on met en forme les fichiers source de façon à faciliter leur lisibilité, souvent grâce à l'insertion d'espaces pour aérer le code (indentation).

Exemple de codes équivalents



Prenons un exemple de code aéré et bien commenté.
Code PHP :
<?php
/**
 * @desc Une classe d'exemple
 * @author Développeur <developpeur@societe.com>
*/
class Personne
{
     /**
      * @desc Construit un personnage
      * @param $nom_personne Nom de la personne
     */
    function Personne($nom_personne)
    {
        $this->nom = $nom_personne;
    }
 
     /**
      * @desc Dit bonjour à quelqu'un
      * @param string $personne nom de la personne à qui dire bonjour
     */
    function dire_bonjour($personne)
    {
        echo $this->nom . ' dit bonjour à ' . $personne;
    }
 
     /**
      * string Nom de la personne
     */
     var $personne = '';
}
 
//Instanciation de la classe
$une_personne = new Personne('Jean');
 
//On dit bonjour
$une_personne->dire_bonjour('Pierre');
?>

Ce code est strictement identique au suivant vis-à-vis de l'interpréteur PHP.
Code PHP :
<?php
class Personne
{
function Personne($nom_personne)
{
$this->nom=$nom_personne;
}
function dire_bonjour($personne)
{
echo $this->nom.' dit bonjour à '.$personne;
}
var $personne='';
}
$une_personne=new Personne('Jean');
$une_personne->dire_bonjour('Pierre');
?>

On pourrait même le réduire davantage en supprimant les sauts de ligne mais après l'exemple devient complètement illisible.

Ces deux codes donnent exactement le même résultat lors de leur exécution. Pourtant, le premier contient 771 caractères alors que le deuxième en compte seulement 280. Sur cet exemple, on voit donc qu'il y a plus de la moitié des caractères qui n'ont aucun sens pour l'interpréteur PHP. Il parait donc assez évident que la lecture des fichiers sources est plus rapide.

Le but de POptimizer



POptimizer permet de supprimer automatiquement une très grande majorité des caractères illisibles de façon à diminuer considérablement le nombre de caractères des fichiers source. Il transforme les fichiers source de la même manière que ce qui a été présenté dans l'exemple ci-dessus. Tous les commentaires du fichier sont supprimés, ainsi que toutes les indentations et les espaces inutiles entre les opérateurs du langage. Seuls les retours à la ligne sont conservés, pour une raison très simple, cela permet de conserver les numéros de ligne. Cela n'a donc aucune conséquence sur la maintenance du code, puisqu'un patch qui indique de modifier une certaine ligne sera également applicable sans difficultés.

Bien sûr POptimizer fait une copie des fichiers et ne les remplace pas brutalement. En fait, POptimizer s'utilise lorsqu'on veut mettre le code en production, au moment de l'export. Il est évident que l'objectif n'est pas d'écrire les fichiers sans commentaire et sans mise en forme, mais juste de déployer une application plus optimisée.

Téléchargement de POptimizer



L'exécutable



L'exécutable de POptimizer est téléchargeable ici.
Vous obtenez un fichier nommé poptimizer.jar que vous ne devez pas exécuter directement en cliquant dessus mais en le lançant en ligne de commande. Voir le paragraphe suivant pour savoir comment l'exécuter.

Le code source



Le code source est distribué sous licence GNU/GPL. Vous pouvez le consulter ici et le télécharger à partir du SVN de développement à l'adresse suivante :
http://phpboost.googlecode.com/svn/tools/POptimizer/
.

Utilisation de POptimizer



Lancer POptimizer



POptimizer est écrit en Java, il nécessite d'avoir une machine virtuelle Java installée sur sa machine pour pouvoir l'exécuter. Si ce n'est pas votre cas, vous pouvez télécharger Java ici ou si vous êtes sur Linux l'installer avec votre gestionnaire de paquets comme décrit ici pour Ubuntu.

POptimizer s'exécute en ligne de commande. Il se lance en tapant la commande suivant en invite de commande. La commande est évidemment à adapter en fonction de là où vous vous trouvez dans votre arborescence de fichiers ainsi que du nom de l'exécutable (nommé poptimizer.jar lorsque vous le téléchargez).
Code BASH :
java -jar poptimizer.jar


Les options



Fichiers à optimiser



L'option
-i
permet de déterminer quel est le dossier à optimiser, elle est obligatoire. Il sera parcouru récursivement et tous ses enfants seront également optimisés à l'exception de ceux qui ont été exclus (voir l'option
-e
) et des fichiers qui ne sont pas des sources PHP qui eux seront copiés. L'arborescence de sortie sera la même que l'arborescence d'entrée.

Exemple : le code suivant optimisera tous les fichiers PHP du dossier dossiersource et recréera la même arborescence dans le dossier dossiercible.
Code BASH :
java -jar poptimizer.jar -i dossiersource -o dossiercible


Répertoire cible



L'option
-o
permet de déterminer quelle est le répertoire cible de l'optimisation, c'est-à-dire dans quel répertoire sera reconstituée l'arborescence passée en entrée. Si le répertoire cible indiqué n'existe pas, il sera créé.

Exemple : le code suivant optimisera tous les fichiers PHP du dossier dossiersource et recréera la même arborescence dans le dossier dossiercible.
Code BASH :
java -jar poptimizer.jar -i dossiersource -o dossiercible


Fichiers/dossiers à exclure



Par défaut, POptimizer va optimiser l'ensemble des fichiers contenus dans le répertoire source. Cependant, il se peut qu'il y ait des fichiers ou des répertoires que vous ne vouliez pas optimiser. Pour cela, l'option
-e
permet d'exclure certains chemins de l'optimisation. Ces fichiers qui seront ignorés seront tout de même copiés pour conserver l'arborescence originale.

Exemple : le code suivant optimisera tous les fichiers PHP du dossier dossiersource sauf le fichier dossiersource/fichier.php et l'ensemble du contenu du dossier dossiersource/sousdossier. POptimizer recréera la même arborescence dans le dossier dossiercible.
Code BASH :
java -jar poptimizer.jar -i dossiersource -o dossiercible -e dossiersource/fichier.php dossiersource/sousdossier


Choix des modules d'optimisation



Pour l'instant POptimizer se décompose en deux modules, un module qui retire les commentaires et un autre qui enlève tous les espaces inutiles (indentation et autour des opérateurs du langage). Par défaut, les deux modules sont appliqués sur les fichiers à optimiser, mais il est possible de choisir manuellement les modules à appliquer grâce à l'option
-m
suivie de la liste des modules à appliquer. Les modules disponibles sont les suivants :
  • comments
    : ce module retire tous les commentaires
  • spaces
    : ce module retire tous les espaces inutiles
  • all
    : sélectionne tous les modules (par défaut)

Exemples :
Le code suivant retirera uniquement les espaces des fichiers à optimiser.
Code BASH :
java -jar poptimizer.jar -i dossiersource -o dossiercible -m spaces

Le code suivant retirera uniquement les commentaires des fichiers à optimiser.
Code BASH :
java -jar poptimizer.jar -i dossiersource -o dossiercible -m comments

Le code suivant fera une optimisation totale sur les fichiers à optimiser (équivalent à la commande sans l'option
-m
).
Code BASH :
java -jar poptimizer.jar -i dossiersource -o dossiercible -m all


Encodage des fichiers



Les fichiers source peuvent être encodés en différents jeux de caractères. Le code est généralement écrit en anglais donc les problèmes d'encodage sont limités mais il n'est pas rare que des caractères spéciaux soient présents dans les fichiers.
POptimizer est capable de lire et d'écrire les fichiers dans différents jeux de caractères grâce aux options
-ics
et
-ocs
pour les encodages respectivement en entrée et en sortie (input charset et output charset).
Les jeux de caractères disponibles sont les suivants :
  • UTF-8 (utilisé par défaut par POptimizer si on ne le précise pas, ce jeu de caractère est généralement par défaut sur Linux)
  • UTF-16 (assez rarement utilisé)
  • ISO-8859-1 (encodage européen, par défaut sur Windows et très utilisé sur les applications Web écrites en PHP car le support d'UTF-8 n'est pas natif dans PHP 5)
  • US-ASCII (rarement utilisé)


Exemple : on souhaite optimiser un répertoire dont les fichiers sont encodés en UTF-8 et on souhaite l'exporter en ISO-8859-1.
Code BASH :
java -jar poptimizer.jar -i dossiersource -o dossiercible -ics UTF-8 -ocs ISO-8859-1


Il est à noter qu'il est possible de préciser seulement un des deux encodages. Dans le cas où on ne précise pas, UTF-8 est utilisé par défaut.

Autres



L'option
-h
permet d'obtenir de l'aide sur la commande. S'affiche alors un résumé de cette page de documentation.

L'option
-v
permet d'obtenir la version de POptimizer que vous utilisez.
Cette page a été vue 4170 fois