outils

Le compresseur de fichiers nGzip

Qu'est-ce que c'est ?

Le compresseur nGzip est un script PHP qui produit une version compressée d'un fichier directement sur le site. À quoi cela sert-il ? Juste à gagner du temps, à mieux utiliser les ressources et à améliorer l'expérience d'utilisateur, rien que ça ! Mais lisez plutôt...

La visite d'une page sur un site donne lieu à une négociation de contenu entre le navigateur et le serveur (Apache). Si elle est concluante, le serveur envoie la version compressée de la page. Plus vite rendue à destination, elle est aussi plus vite exploitée. La réactivité d'un site a toujours la faveur des utilisateurs.

La négociation de contenu Apache

Dans le dialogue qui s'instaure entre le navigateur et le serveur, tout se joue au niveau des en-têtes contenues dans les requêtes et réponses HTTP.

Le navigateur demande un certain fichier au serveur : il annonce ses possibilités de traitement au travers des en-têtes de la requête. Le serveur en tient compte pour déterminer le fichier à servir : il répond en envoyant le fichier accompagné d'en-têtes, qui sont autant d'indications de traitement pour le navigateur.

Prenons l'exemple suivant :

La requête du navigateur

En-têtes HTTP envoyées par le navigateur

Accept-Charset: UTF-8,*
Host: example.org
Connection: keep-alive
Keep-Alive: 300
Accept-Language: fr,en;q=0.5
Accept: text/xml,...,*/*;q=0.5
User-Agent: Mozilla/5.0 ...
Accept-Encoding: gzip, deflate

Notez l'en-tête Accept-Encoding indiquant que le navigateur accepte les formats de compression gzip et deflate.

La réponse du serveur Apache

En-têtes HTTP envoyées par le serveur

Date: Tue, 24 Jul 2007 15:32:58 GMT
Server: Apache
Last-Modified: Mon, 23 Jul 2007 12:27:33 GMT
Etag: "40f98da-636-46a49eb5;468273e9"
Accept-Ranges: bytes
Content-Length: 1590
Content-Type: text/html
Content-Language: fr
Vary: negotiate, accept-language, accept-encoding
TCN: choice
Content-Location: fichier.fr.html.gz
Content-Encoding: gzip

Les en-têtes Vary et TCN confirment l'issue positive d'une négociation de contenu, l'en-tête Content-Location donne le nom du fichier servi, et Content-Encoding précise qu'il est compressé au format gzip (suffixe .gz).

Le navigateur tiendra compte de ces indications pour traiter comme il se doit le contenu du fichier à suivre, c'est-à-dire le décompresser puis l'interpréter normalement.

Le résultat de la négociation

Le mécanisme de la négociation repose sur un algorithme complexe, sommairement illustré au travers des exemples suivants.

Tableau de résultats avec Accept-Encoding: gzip et Accept-Language: fr,en
Cas Demandé Disponibles Servi Commentaire
(1) nom.html nom.html
nom.html.gz
nom.html pas de négociation
(2) nom.html nom.html.html
nom.html.gz
nom.html.gz on force la négociation en sur-suffixant le nom
(3) nom.html nom.html.gz
nom.html.en
nom.html.fr
nom.html.fr la langue a priorité sur le codage
(4) nom.html nom.html.la
nom.html.en
nom.html.en.gz
nom.html.en.gz la sélection a lieu sur la langue secondaire puis le codage
(5) nom.fr nom.html.fr
nom.en.html
nom.html.en
aucune base ne correspond
(6) nom nom.fr.html
nom.html.en
nom.fr.html le succès de la négociation est quasi assuré

Ce qu'il faut retenir du tableau ?

La configuration du serveur Apache

Nous prendrons le cas d'un site en hébergement mutualisé avec Apache v.1.x. En général, la seule option laissée à l'utilisateur pour modifier le comportement du serveur est celle d'utiliser un fichier htaccess. Si l'hébergeur l'interdit, voyez ailleurs…

Voici les directives qui doivent y apparaître au minimum pour que la négociation ait lieu :

Options +MultiViews

AddEncoding x-gzip .gz
AddType text/html .gz

Si le site est multilingue, on y inclut aussi les déclarations de langue. Par exemple, du français et de l'anglais :

AddLanguage fr .fr
AddLanguage en .en
LanguagePriority fr en

Si les feuilles de style CSS et/ou les scripts JavaScript doivent faire l'objet d'une négociation, on place alors un fichier htaccess supplémentaire dans les répertoires respectifs. Les noms des fichiers doivent être sur-suffixés, par exemple, style.css.css ou script.js.js, car il n'y aurait pas de négociation sinon (cf. la règle 1).

Dans le répertoire des feuilles de style :

ForceType text/css

Dans le répertoire des scripts :

ForceType text/javascript

Par précaution, testez d'abord le bon fonctionnement des fichiers htaccess dans des répertoires à part.

La compression des fichiers

Dans l'exemple de requête précédent, l'en-tête Accept-Encoding comprenait 2 valeurs : gzip et deflate. La première correspond à un format de compression établi, reconnu par 90 % des navigateurs actuels, la seconde à un format plus récent donc moins répandu.

La compression est l'opération qui fabrique une version équivalente mais allégée d'un fichier. Cette version transite plus vite dans les réseaux et le navigateur en disposera donc plus tôt. La décompression est l'opération qui restitue le fichier original. Réalisée par le navigateur, elle est automatique et quasi instantanée.

Compression à la volée contre compression au préalable

Le serveur peut effectuer la compression à la volée. Pour gzip, cela implique l'utilisation d'un module supplémentaire (mod_gzip), rarement présent en hébergement mutualisé. Quant à deflate, le serveur Apache version 2 inclut en standard le module mod_deflate : la compression est alors automatique si activée. Mais cette version est encore bien récente. Les modalités de la négociation sont les mêmes quel que soit le format.

Pour pallier l'absence de ces modules, on peut compresser les fichiers au préalable. Le serveur pourra donc libérer les ressources qu'il aurait sinon consacrées à la compression. Ces ressources sont d'autant plus précieuses que la charge sur le serveur est forte, tandis que les utilisateurs attendent.

La compression à bon escient

Quand faut-il compresser les fichiers ? Ça dépend… Les situations sont bien sûr différentes. Toujours est-il, voici quelques lignes directrices :

  1. On compresse seulement les fichiers de texte (les fichiers HTML, JavaScript, CSS, etc.). Par exemple, les images sont déjà compressées et ne gagnent rien à l'être à nouveau ;
  2. Plus le fichier est volumineux, plus le résultat est spectaculaire. Les fichiers compressés (gzip) font couramment entre 20 et 30 % du volume des fichiers de départ. Parfois moins de 10 % pour les plus gros fichiers (500 ko et plus) ;
  3. Les sites statiques à fort contenu textuel (articles, documentation, etc.) devraient proposer une version normale et une version compressée ;
  4. Concernant les sites dynamiques, les langages de script qui les animent (PHP, Python, ASP, etc.) offrent généralement des fonctions de compression et de génération des en-têtes HTTP nécessaires. C'est toujours utile.

Les solutions adoptées ici

Si je vous entretiens du tandem « négociation de contenu/compression de fichiers », c'est que ce site applique la recette. Toutes les pages susceptibles d'être compressées le sont, que ce soient les pages HTML, les feuilles de style ou les scripts. Ce sont beaucoup de documents textuels, parfois très lourds (certains dépassent 600 ko). Autant de caractéristiques en faveur de leur compression.

Mais la mise en œuvre est fastidieuse. Il faut renommer les fichiers puis les compresser, ensuite les télécharger sur le site, et recommencer encore à chaque mise à jour. Les inconvénients contrebalanceraient-ils les avantages au point de condamner une solution si prometteuse ? Non, bien sûr. Tout peut s'arranger en automatisant un peu les choses.

C'est la raison d'être de nGzip : le script permet de gérer en ligne la compression et le renommage approprié de tous les fichiers de type HTML, JavaScript et CSS. On peut facilement ajouter d'autres types en éditant le script (cf. les commentaires dans le code).

Installation et utilisation

Conditions requises

Le script nGzip nécessite Apache (version 1 ou 2), PHP (version 4 ou 5) avec l'extension Zlib (presque toujours installée), la possibilité d'utiliser des fichiers htaccess et un navigateur. Certains effets d'interface ne sont disponibles que si JavaScript est activé sur le navigateur.

Télécharger le script

Choisissez le format d'archive souhaité : nGzip (Zip) ou nGzip (Tgz).

Installation

Décompressez l'archive puis chargez le fichier ngzip.php sur le site. Le script peut s'installer n'importe où. Par précaution, il vaut mieux le placer dans un répertoire à accès protégé car il pourrait révéler des détails de la structure du site sinon. En revanche, le script ne peut pas modifier ou détruire les fichiers originaux.

Utilisation

Remarque :
Bien que le traitement des fichiers soit très rapide, le délai alloué au script sera peut-être insuffisant si les fichiers sont nombreux et/ou volumineux. Auquel cas, il suffit de traiter le contenu du répertoire en plusieurs fois. Le calcul de la date et de la taille consomme aussi quelques millisecondes en plus.

À quoi ça ressemble ?

Voici des copies d'écran (cliquez sur les images pour les agrandir) :

La fenêtre de démarrage

La fenêtre de démarrage

Tous les fichiers sont affichés

Tous les fichiers sont affichés

Les fichiers sont traités (taille affichée)

Les fichiers sont traités (leur taille est affichée)

Le navigateur a-t-il bien eu la version compressée ?

Si vous utilisez le navigateur Firefox, l'extension Web Developer a une option pour voir les en-têtes de réponses. Certains sites permettent de vérifier que les pages reçues sont bien compressées, par exemple, Leknor, GidNetwork, et d'autres.

La prochaine fois…

Peut-être dans une version ultérieure :

Copyleft

Le script est mis à disposition sous licence GPLv3.

Historique

© 1999-2008 yoyodesign.org — Certains droits réservés