2010-11-15 6 views
7

J'ai créé un fichier style.css.php avec ce code:PHP - Envoi gzip JS/CSS compressé

<?php 

    $gzip = (ob_get_length() === false && !ini_get("zlib.output_compression") && ini_get("output_handler") != "ob_gzhandler" && extension_loaded("zlib") && substr_count($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') && !headers_sent()); 

    if(!$gzip) header('Location: style.css'); 

    header('Content-type: text/css'); 
    header('Cache-Control: no-cache'); 
    header('Expires: Mon, 1 Jan 1901 04:20:00 GMT'); 

    ob_start('ob_gzhandler'); 

    include "style.css"; 
?> 

Que pensez-vous? Est-ce un bon moyen de compresser les fichiers js/css? Y a-t-il une meilleure manière de faire cela? Je fais cela pour une application publique. qui peut être téléchargé par n'importe qui. Il y aura donc des personnes sur des hôtes partagés avec gzip désactivé

+0

Je suppose que votre serveur ne supporte pas la compression? –

+0

Qu'est-ce que vous essayez d'atteindre par ce code? Avantage attendu? – zod

+0

Eh bien, je suis le test sur un serveur partagé, et la compression fonctionne. Travaille localement aussi. Ou voulez-vous dire la compression automatique effectuée par le serveur? Est-ce possible? – Alex

Répondre

10

Non, pas OK. Il y a beaucoup de choses qui ne vont pas. L'include, ne pas mourir après la redirection, sans tenir compte de la méthode deflate, ...

Ceci est très simple à faire avec PHP, car le gestionnaire de sortie zlib détecte automatiquement la compression appropriée à envoyer au client (le cas échéant); tout ce que vous avez à faire est de lui permettre:

<?php 
if (extension_loaded("zlib") && (ini_get("output_handler") != "ob_gzhandler")) { 
    ini_set("zlib.output_compression", 1); 
} 

readfile('style.css'); 
+0

merci :) puis-je vous demander pourquoi readfile() est mieux que d'inclure? et devrais-je encore rediriger si la condition est fausse? J'ai utilisé l'en-tête ("Location") parce que je pensais que cela permettrait d'économiser certaines ressources du serveur. – Alex

+0

& si j'essaie d'activer la compression de sortie dans html généré, j'obtiens un avis: Avis: ob_end_flush() [ref.outcontrol]: échec de la suppression de la compression du tampon zlib :( – Alex

+5

readfile() aspire juste le fichier en morceaux et les envoie include/require lancera les données via l'analyseur PHP en premier, ce qui est une étape inutile si le fichier est en CSS pur –

2

Le serveur doit le faire automatiquement s'il est configuré correctement.

3

Si vous utilisez votre site avec Apache, vous pouvez utiliser mod_gzip ou mod_deflate. Ils sont généralement disponibles sur des hôtes partagés et peuvent être configurés dans des fichiers .htaccess.

Ajoutez les lignes à votre fichier .htaccess suivantes:

(soit un par type MIME)

+1

Il n'est pas nécessaire d'en avoir un par ligne. Voir ma réponse: http://stackoverflow.com/questions/4189429/php-sending-gzip-compressed-js-css/4189661#4189661 – Treffynnon

2

Adam est sur la bonne voie, mais il n'a pas besoin d'être un type MIME par ligne. Voir le manuel Apache2 pour plus d'informations sur le AddOutputFilterByType directive.

AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript text/javascript-x application/javascript 
0

Premier SET » .htaccess'

RewriteEngine on 
RewriteRule style.css style.css.php 
<IfModule mod_deflate.c> 
AddOutputFilterByType DEFLATE text/plain 
AddOutputFilterByType DEFLATE text/html 
AddOutputFilterByType DEFLATE text/xml 
AddOutputFilterByType DEFLATE text/css 
AddOutputFilterByType DEFLATE application/xml 
AddOutputFilterByType DEFLATE application/xhtml+xml 
AddOutputFilterByType DEFLATE application/rss+xml 
AddOutputFilterByType DEFLATE application/javascript 
AddOutputFilterByType DEFLATE application/x-javascript 
SetOutputFilter DEFLATE 

BrowserMatch ^Mozilla/4 gzip-only-text/html 
BrowserMatch ^Mozilla/4.0[678] no-gzip 
BrowserMatch MSI[E] !no-gzip !gzip-only-text/html 

SetEnvIfNoCase Request_URI 
.(?:gif|jpe?g|png)$ no-gzip dont-vary 
</IfModule> 

recommende créer un dossier css et mettre fichiers.

Avec RewriteRule vous n'avez pas besoin de définir header('Content-type: text/css'); et d'autres fonctions définies gzip sur le serveur avant que le processus php. le code fonctionne plus vite maintenant!

+1

** Important!** _Certains navigateurs ne supportent pas gzip pour css, puis définissent gzip only text/html._ Plus recommandé **. Htaccess ** avec ces règles. –