Phpminify, un minifier de fichier PHP

Phpminify est un programme écrit en PHP qui permet de réduire la taille des fichiers PHP tout en les conservant pleinement fonctionnels. Il a été créé avant tout dans le but de découvrir le fonctionnement du parser de PHP puisqu’il utilise la commande token_get_all.

Une des règles suivies pendant son élaboration a été de n’introduire aucun bug de fonctionnement dans les fichiers sources minifiés. Il permet notamment de minifier tous les fichiers de Wordpress 3.6.1 ou de DotClear 2.5.3 sans aucune retouche préalable ou après coup. En revanche, en supprimant tous les commentaires, les frameworks utilisant les Doc Blocks (token T_DOC_COMMENT) ne pourront pas utiliser cet outil. Cela inclut Symfony 2, Zend Framework, Doctrine ou PHPUnit.

Pré-requis

Phpminify a été testé avec PHP 5.3 avec l’interpréteur PHP (PHP-CLI) en ligne de commande sous Ubuntu 12.04.

Téléchargement

Lorsque vous utilisez ce programme, assurez-vous de faire une copie de sauvegarde des fichiers que vous voulez minifier. Même si j’ai fait tout ce que je pouvais pour que les sources PHP restent pleinement fonctionnels, je ne peux pas vous garantir que cela fonctionnera tout le temps.

Télécharger phpminify.php

Utilisation

L’aide est incluses dans le fichier PHP. Pour la faire apparaître, il suffit de taper php phpminify.php --help.

Quelques exemples d’utilisation :

# Affichage de l’aide en ligne
php phpminify.php --help

# Minifie le fichier exemple.php et l’enregistre en exemple.php.min.php
php phpminify.php exemple.php

# Minifie le fichier exemple.php et l’écrase
php phpminify.php -o exemple.php

Optimisations

Suppression des espaces blancs et des commentaires

Les espaces blancs et les commentaires sont tout simplement supprimés. Les espaces blancs nécessaires au parsing sont ajoutés lors de la génération du résultat.

Remplacement de else if par elseif

Afin de gagner un octet, le couple else if est remplacé par elseif.

Remplacement de public function par function

Par défaut, les méthodes sont publiques, le mot-clé public est donc retiré quand il se trouve devant le mot-clé function.

Concaténation des instructions use successives

Les commandes use successives sont remplacées par une seule commande. Par exemple, use X; use Y; use Z; est remplacé par use X,Y,Z;.

Optimisation des chaînes de caractères

Les chaînes de caractères à double quotes subissent quelques optimisations. Les séquences de caractères échappées sont transformées en leur octet équivalent.

Par exemple, les \t sont remplacés par l’octet de valeur 0x09. Les séquences échappées de valeurs octales et hexadécimales sont également prises en compte.

Optimisation des nombres

Les zéros de trop dans les chiffres sont supprimés et les valeurs octales et hexadécimales sont remplacées par leur équivalent décimal.

Remplacement de exit par die

Les instructions exit et die sont identiques mais die utilise un octet de moins.

Remplacement de (integer) par (int)

De fonctionnement identique, remplacer (integer) par (int) permet de gagner quatre octets.

Remplacement de (boolean) par (bool)

De fonctionnement identique, remplacer (boolean) par (bool) permet de gagner trois octets.

Renommage des variables locales

Probablement la partie la plus délicate, le renommage des variables ne peut se faire que dans la portée d’une fonction ou d’une méthode. En dehors, on ne peut pas déterminer si les variables seront utilisées par d’autres fichiers PHP via require ou include.

Les variables suivantes ne sont pas renommées : $GLOBALS, $this, $_GET, $_POST, $_COOKIE, $_SESSION, $_SERVER, $_ENV, $_FILES, $_REQUEST, $php_errormsg, $HTTP_RAW_POST_DATA, $http_response_header, $argc, $argv.

Les variables globables sont également ignorées dans le processus.

Si la fonction ou la méthode utilise compact, extract ou $$name, le renommage sera ignoré.