Compression zlib sans passer par la directive « zlib.output_compression »
23:52 24 09 2007En PHP, il est possible de compresser les sources envoyés vers le navigateur afin d’économiser de la bande passante. Cela s’appelle la compression zlib. Il est possible de l’activer directement dans le fichier php.ini grâce à la directive zlib.out_compression.
Mais voilà, on n’a pas toujours accès au fichier php.ini. Vous allez alors me dire
« bah, t’as qu’à faire un ini_set() dans ton code! ».
Je suis d’accord, sauf que l’utilisation d’ini_set() est gourmande en temps d’exécution vu que l’a conf est rechargée à chacun de ses appels.
Une solution tierce que m’a donné un stagiaire sur une formation que j’anime cette semaine est de passer par l’output buffering.
Il est possible de passer une fonction de callback à ob_start(). Cette fonction sera exécutée sur l’ensemble de votre buffer, donc de votre page. Or il existe une fonction spécifique en PHP permettant d’effectuer la compression zlib avec l’output buffering : ob_gzhandler()
En complant les deux, on obtient une compression zlib sur sa page :
ob_start(‘ob_gzhandler’);
Cette astuce est certainement connue de beaucoup de monde vu qu’elle est directement décrite dans la documentation de PHP (http://fr.php.net/manual/fr/function.ob-gzhandler.php) mais je doit avouer que je n’étais jamais tombé dessus.
J’utilise ob_start() avec ob_gzhandler depuis plusieurs année déjà, cette une fonction que j’aprécie énormément.
Même avec ob_get_content() tu obtiens le code envoyé au navigateur non compressé. C’est vraiment apréciable.
PS : tu peux aussi faire ta propre fonction de callback ce qui peut s’avéré très utile !