Oct 25 2007
Compactar com GZip e armazenar em Cache arquivos .js e .css (solução)
Editado:
Pessoal, para a melhor solução para este tipo de problema vejam a regra número 4 deste post. Se quizer entender mais sobre GZip continue lendo.
Fim da edição.
GZip é uma compactação feita pelo servidor web antes de enviar os arquivos para o browser, mas para que isso ocorra com sucesso deve-se mudar o cabeçalho dos arquivos para indicar que o arquivo aceita esse tipo de compactação, para que o servidor compacte este arquivo e quando esse arquivo chegar no browser, este descompacte-o, tornando-o um arquivo normal como todos os outros novamente.
A motivo de informação sobre os benefícios da compactação GZip darei um exemplo de uma biblioteca muito famosa, a JQuery, que tem em torno de 77kb em sua forma normal. Se for usado o compactador de javascript do Yahoo! ele passa a ter em torno de 46kb, e se for usada a compactação GZip em cima desse arquivo a biblioteca fica com incríveis 15kb!
Vinha a um tempo pensando em uma forma inteligente de compactar arquivos “.js” e “.css” usando GZip. Li vários artigos no Yahoo! e em fórums diversos e não encontrei nada falando a respeito, e quando falavam não era de forma clara, tanto é que só fui ver uma forma inteligente de se fazer isso a uns minutos atrás, quando achei algo a respeito no site do Joomla. É uma extensão que modifica o cabeçalho dos arquivos que são incluídos nas páginas desse sistema. Vendo a extensão eu pude ver o quão simples é modificar o cabeçalho de arquivos .css e .js de forma inteligente. Antes havia pensado em modificar a extensão dos arquivos para “.php” e fazer essas modificações (trabalho de corno), vi que funcionou mas não era viável em um projeto grande.
Bom, falei demais já. Vamos para o código da solução:
/**
* @author Fábio Miranda Costa<br />
* Usado para compactar arquivos JS e CSS, acrescenta-os ao cache do browser
* e faz algumas melhorias adicionais. <script src="incs/file_inc.php?file=funcs.js" type="text/javascript"><!--mce:0--></script>
*/
$file = $_GET["file"];
$ext = substr($file,strrpos($file, ".")+1,strlen($file));
ob_start ("ob_gzhandler");
if($ext=="js") $ext="javascript";
header( "Content-type: text/".$ext."; charset: <span class="attribute-value">iso-8859-1</span>");//não se esqueça de mudar para o charset que você usa
header( "Content-Encoding: gzip,deflate");
header( "Expires: ".gmdate("D, d M Y H:i:s", time() + (24 * 60 * 60)) . " GMT");//adiciona 1 dia ao tempo de expiração
header( "ETag: ");//a idéia é apagar o conteúdo da Etag, ver post http://www.meiocodigo.com/2007/12/21/melhorando-o-tempo-de-carregamento-de-um-site/
header( "Cache-Control: must-revalidate, proxy-revalidate" );
include($file);
ob_flush();
Fiz esse código o mais compacto possível, já que será usado em todos os includes de css e js do site.
Não vou explicar muito como funciona, apenas como usá-lo, que é o que importa.
Para usar é muito fácil, apenas crie um arquivos incluindo o código acima, no meu exemplo o arquivo é “file_inc.php”, e coloque no cabeçalho do seu site os includes de arquivos css e javascript seguindo os exemplos abaixo:
para javascript:
<script src="incs/file_inc.php?file=funcs.js" type="text/javascript"></script>No atributo “src” coloque o caminho para o arquivo “file_inc.php” depois passe a variável “file” usando GET, ou seja adicione o texto “?file=” logo após o nome do arquivo, como pode-se ver no exemplo e depois coloque o endereço do arquivo “.js” que você quer incluir em seu site. Lembrando que esse endereço será sempre relativo ao arquivos file_inc.php, ou seja, se o “file_inc.php” estiver na pasta “inc/includer/” e o arquivo que você quer incluir está na pasta “inc/js/” o “src” do include ficará “inc/includer/file_inc.php?file=../js/funcs.js”.
para css:
<link href="incs/file_inc.php?file=styles.css" rel="stylesheet" type="text/css" />Com o css é a mesma coisa, o que muda é apenas o óbvio, ou seja, a tag será “link” e o atributo usado passará a ser “href”.


June 11th, 2010 at 20:13
Olá pessoal, sou bem leigo nesses assuntos, mais de acordo com o google preciso compactar meu css e js com gzip,isse código ira resolver meu problema? uma duvida, eu uso wordpress e meu css fica localizado assim…wp-content/themes/0_1/style.css
Como exatamente deve ficar o código do script css?
Obrigado desde já! Te mais Deivid
June 21st, 2010 at 05:54
Muito bom, tive que fazer alguns ajustes, meu problema nem era a compactação, eu queria fazer com que um arquivo javascript chamado pela função createElement(’script’) não fosse armazenado em cache, porque ele trazia um php dentro dele que armazenava uma timestamp no banco de dados… muito bom mesmo!!! o meu codigo ficou assim
<?php ob_start ("ob_gzhandler"); header( 'Content-type: text/javascript; charset: iso-8859-1′);//não se esqueça de mudar para o charset que você usa header( “Content-Encoding: gzip,deflate”); header( “Expires: “.gmdate(“D, d M Y H:i:s”, time() + (24 * 60 * 60)) . ” GMT”);//adiciona 1 dia ao tempo de expiração header( “ETag: “);//a idéia é apagar o conteúdo da Etag, ver post http://www.meiocodigo.com/2007/12/21/melhorando-o-tempo-de-carregamento-de-um-site/ header( “Cache-Control: must-revalidate, proxy-revalidate” ); //aqui eu inseri meu código include(‘connection.php’); $user_time=time(); $user_id=$_GET['user_id']; $mysql_query=mysql_query(“UPDATE usuarios_ids SET user_time=’$user_time’ WHERE user_id=’$user_id’”,$connection); ?> setTimeout(‘atualiza()’,10000);
September 6th, 2010 at 14:23
Cara, muito bom mesmo. Adorei. O bom que posso adaptar para carregar todos os meus js e css por exemplo. load-style.php?file=portal,header,footer e load-script.php?file=jquery,core,bookmaker
Muito obrigado mesmo.