![]()
Compressez vos CSS avec Php
Par Wilfried,
mardi 17 août 2010 à 16:04
Ressources Gratuites
:: #2783
:: rss
A défaut d'utiliser des outils comme Yui compressor ou csscompressor, vous pouvez utiliser un petit script php qui fera le boulot pour vous. Cela vous fera gagner du temps, et vous évitera de jongler entre plusieurs version d'une même feuille de style ! Dans la pratique, le but de la manœuvre est de sauver quelques Ko afin de réduire votre consommation de bande passante, et surtout accroitre la vitesse de chargement de vos pages. Le bout de script se situe dans la suite de ce billet...
Il existe de nombreuses astuces autour du développement CSS, et en particulier avec PHP. Mais en général ce sont les mêmes qui reviennent, à savoir :
- ne faire qu'un appel de style css par page : idéalement regrouper tous les scripts en un via un peu de réécriture, et du php pour "merger" vos fichiers.
- forcer le cache des fichiers css via une date d'expiration lointaine ; se passe via votre fichier htaccess, ou depuis les headers php que vous pourrez renvoyer
- compresser vos fichier : des outils online le font pour vous, mais il y a aussi la solution maison, et c'est ce qui nous interesse dans ce billet !
- etc ...
Voilà pour les principales. Pour le détail de toutes les bonnes pratiques les plugins firefox Yslow et Page Speed vous feront un bon reporting 
Revenons donc sur la compression de vos fichiers CSS, et au script en question :
<?php
# Gzip
ob_start("ob_gzhandler");
# Header infos : set to a reasonable interval. I.e. 3600 (sec.) = 1 hr.
$expire_offset_time = 3600*24*7;
header('Content-type: text/css');
header('Cache-Control: must-revalidate');
header('Expires: ' . gmdate('D, d M Y H:i:s', time() + $expire_offset_time) . ' GMT');
# Compress output
function compress($buffer) {
/* remove comments */
$buffer = preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $buffer);
/* remove spaces before / after delimiters */
$buffer = preg_replace(array('/(:|;|}|{)( |\r|\t|\n)+/','/ ({|;)/'), '$1', $buffer);
/* remove tabs, extra spaces, newlines, etc. */
$buffer = str_replace(array("\r\n", "\r", "\n", "\t", " \n" , ' ', ' ', ' '), '', $buffer);
/* keep some readable content */
$buffer = str_replace('}', "}\n", $buffer);
return $buffer;
}
# Output buffering
ob_start("compress");
# Global includes
include("_layout/reset.php");
include("_layout/layout.php");
include("_layout/typo.php");
/* etc … */
# flush output to client
ob_end_flush();
(Attention, les espaces ne sont pas correctement interprétés dans ce billet, je vous conseille de copier le script depuis ce fichier)
Voilà c'est aussi simple que cela !
Je pense que vu la simplicité, cela se passe d'explication pour la mise en place, je vous fait confiance ! Toute la magie s'opère dans la fonction compress(). J'ai trouvé cette dernière sur phpsnippets.info, et customisée encore un peu plus à mon gout, en supprimant encore des espaces supplémentaires (notamment autour des attributs), et en ajoutant un saut de ligne devant chaque règle, afin de garder un minimum de lisibilité.
En espérant que ce script vous serve prochainement 
ps : s'il y a un volontaire pour proposer et expliquer ce script en vidéo sur tuto.com, qu'il n'hésite pas !













Vos Commentaires
15 commentaires déjà postés
1. Le mardi 17 août 2010 à 18:34, par 3po
2. Le mardi 17 août 2010 à 18:43, par wiloo
3. Le mardi 17 août 2010 à 20:20, par benjy
4. Le mercredi 18 août 2010 à 11:46, par tetue
5. Le mercredi 18 août 2010 à 15:42, par Siouxsy
6. Le mercredi 18 août 2010 à 16:32, par wiloo
7. Le mercredi 25 août 2010 à 09:22, par Julien THERIN
8. Le lundi 27 septembre 2010 à 09:26, par rolex daytona replica
9. Le mardi 28 septembre 2010 à 09:05, par Omega Seamaster
10. Le mardi 28 septembre 2010 à 09:08, par Rolex deep sea
11. Le mardi 28 septembre 2010 à 09:09, par p90x
12. Le vendredi 26 novembre 2010 à 09:44, par Ugg Boots Sale
13. Le vendredi 26 novembre 2010 à 09:45, par Replica watches
14. Le samedi 18 décembre 2010 à 05:12, par pandora charms
15. Le mardi 18 janvier 2011 à 03:51, par airjordan
Ajouter un commentaire