2010-11-15 23 views
7

he creado un archivo style.css.php con este código:PHP - Envío de gzip comprimido JS/CSS

<?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"; 
?> 

¿Qué opinas? ¿Es esta una buena forma de comprimir archivos js/css? ¿Hay una mejor manera de hacer esto? Estoy haciendo esto para una aplicación pública. que puede ser descargado por cualquier persona. Por lo tanto, habrá personas en hosts compartidos con gzip deshabilitado.

+0

Supongo que su servidor no es compatible con la compresión? –

+0

¿Qué intenta lograr con este código? ¿Ventaja esperada? – zod

+0

y estoy probando esto en un servidor compartido, y la compresión funciona. Localmente también funciona. ¿O te refieres a la compresión automática hecha por el servidor? ¿Es eso posible? – Alex

Respuesta

10

No, no está bien. Hay muchas cosas mal allí. El incluir, no morir después de redirigir, sin considerar el método de desinflar, ...

Esto es muy simple de hacer con PHP, ya que el controlador de salida zlib detecta automáticamente la compresión adecuada para enviar al cliente (si existe); todo lo que tiene que hacer es permitirle:

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

readfile('style.css'); 
+0

gracias :) ¿Puedo preguntar por qué readfile() es mejor que incluir? y ¿debería redireccionar si la condición es falsa? Utilicé el encabezado ("Ubicación") porque pensé que ahorraría algunos recursos del servidor. – Alex

+0

& y si trato de habilitar la compresión de salida en html generado, recibo un aviso: Aviso: ob_end_flush() [ref.outcontrol]: error al borrar la compresión de salida del buffer zlib :( – Alex

+5

readfile() simplemente chupa el archivo en fragmentos y los envía. include/require ejecutará los datos a través del analizador PHP primero, lo cual es un paso inútil si el archivo es puro CSS. –

2

El servidor debería hacerlo de forma automággica si se configura correctamente.

3

Si está sirviendo su sitio usando Apache, puede usar mod_gzip o mod_deflate. Por lo general, están disponibles en hosts compartidos y se pueden configurar en archivos .htaccess.

Añadir las siguientes líneas a su archivo .htaccess:

(es decir, uno por cada tipo MIME)

+1

No es necesario que sea uno por línea. Ver mi respuesta: http://stackoverflow.com/questions/4189429/php-sending-gzip-compressed-js-css/4189661#4189661 – Treffynnon

2

Adam está en el camino correcto, pero no tiene por qué ser un tipo MIME por línea. Consulte el manual de Apache2 para obtener más información sobre AddOutputFilterByType directive.

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

primer set en' .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> 

Recomendado crear la carpeta css y poner los archivos allí.

Con RewriteRule no es necesario configurar header('Content-type: text/css'); y otras funciones establecer gzip en el servidor antes del proceso de php. el código corriendo más rápido ahora!

+1

** ¡Importante!** _Algunos navegadores no soportan gzip para css, luego configuran solo gzip text/html._ Más uso recomendado **. Htaccess ** con estas reglas. –

Cuestiones relacionadas