[PHP] ob_gzhandler compresse vos pages web
Attention, cet article a été déplacé dans les archives, donc le contenu peut ne plus être à jour. A vous de voir 🙂
J’utilise depuis quelques temps ce petit bout de code pour compresser à la volée les données qui sont envoyées sur mes sites. ( En gros, le HTML / xHTML que vous recevez ) :
Ce dernier doit être inséré avant tout envoi de code html / données quelconques.
Malheureusement, j’avais pris la mauvaise habitude de l’insérer au tout début de mon code source, à la suite de la balise ouvrante » <?php « , afin de ne pas l’oublier, au même titre qu’un sempiternel » session_start(); « . Le temps de génération d’une page / envoi au client sur MinURL prenait alors en moyenne 200 ms ( sur mon couple connexion / navigateur ).
Par curiosité, j’ai décidé de le descendre juste avant l’envoi du doctype html, donc après l’exécution de la majorité de mon code, pour atteindre quelque chose de ce style :
ob_start("ob_gzhandler");
?>
Résultat des courses, le temps de génération de la page est descendu à 100ms ( toujours sur mon couple connexion / navigateur ).
Pourquoi donc ? Parce que cette fonction n'a pas eu à guetter les éventuelles données à compresser dans l'exécution du code ( qui rappelons-le, devrait être séparée de la partie "affichage" ). Si un développeur chevronné passe par ici et qu'il veut donner plus de détails, je les lirais avec plaisir :)
Ne faites donc pas la même erreur - de débutant - que moi ;)
Il faut, pour utiliser cela, que la librairie zlib soit installée :
http://fr.php.net/manual/en/ref.zlib.php
Par ailleurs utiliser zlib.output_compression est recommandé par l’équipe php à contrario de ob_gzhandler.
http://fr.php.net/manual/en/zlib.configuration.php#ini.zlib.output-compression
En gros, tu utilises ça partout pour réduire le temps de transfert des entêtes ? et c’est le navigateur qui se charge de décompresser ?
@OSteEL Voilà 🙂 Et si le navigateur n’est pas compatible, une version non compressée est transmise – en principe.
Hum cool ça, je connaissais pas.
Thx pour l’astuce 🙂
Dans l’entête d’un thème WordPress – par exemple – ça marcherai ?
Merci.
@[monsieur t.]* Selon les cas oui, mais c’est en principe déjà utilisé par WordPress 😉
Les quelques fois où je m’en suis servi, je ne le plaçais que lors de l’envoi de mon html.
Ton explication quand au gain au niveau de la génération de la page me semble correcte (mais je ne suis pas développeur chevronné ^^)
@Chibani Je n’ai pas reçu de contradiction, il doit donc y avoir un fond de véracité dans mon article 🙂
y a-t-il un avantage à utiliser ce code PHP si on a déjà mis le module deflate (ou gzip selon la version) sur apache ?
@Mr. Question :
De l’utiliser plutôt que l’activation par défaut de gzip/deflate, oui, car on a la possibilité de l’activer au cas par cas, ce qui est un avantage au niveau des performances sur un serveur plutôt juste comme le mien.
Ensuite, si le module gzip/deflate est installé, il n’est pas nécessairement activé 😉
ok, merci pour la réponse rapide 🙂
Pas de souci pour ça 😉
Petite remarque aussi, tant qu’on a pas fait de flush, aucune donnée ne sera envoyée au navigateur avant que la page ne soit complètement exécutée, alors que normalement la page s’afficeh au fur et à mesure de son exécution. Ca peut être un peu désagréable pour l’utilisateur qui visiterait une page contenant du code un peu lent à certains endroit, ce qui bloquerait tout jusqu’à ce que le script soit entièrement exécuté.
HS : votre Twitter étant locké, je poste ici : « Si quelqu’un peut tweeter à @Darklg ce lien : http://transtextuel.wordpress.com/ blog d’une traductrice (il en cherche un/e) »