Comprenssão de dados: gzip, zlib e deflate

Utlizar a comprenssão de dados é uma excelente prática de otimização de páginas web, além de ser muito fácil de ser implementada . O processo é bem simples: o servidor comprime todo o HTML, CSS e Javascript antes de enviar para o navegador, dessa forma a transferência dos arquivos acontece muito mais rápida.

Compressão de dados - Gzip, Zlib, Deflate

Pesquisando sobre o assunto, me deparei com esses três nomes: gzip, zlib e deflate. What? Qual usar?

Deflate – é um algoritmo de comprenssão de dados.
Gzip – é um programa de comprenssão de dados para sistemas baseados em Unix. Utiliza o algoritmo deflate.
Zlib – é uma biblioteca multiplataforma de comprenssão de dados, criada para popularizar o algoritmo deflate.

Resumindo, tanto faz se você vai usar o Gzip ou o Zlib, já que o algoritmo de compactação é o mesmo.  O importante é ativar a compressão para melhorar a performance do seu site, diminuindo cerca de 70% do tráfego total. Geralmente eu dou preferência para o zlib, pois acho mais rápido de habilitar (veja abaixo). Se ele não estiver disponível então eu habilito o gzip.

Ativando o Zlib

Para usar o Zlib você precisa verificar se a biblioteca está ativa no servidor através da função phpinfo().

compressão zlib
Se estiver, basta adicionar essas linhas de código no header do seu site antes do html.

<?php
/** Coloque essas duas linhas no cabeçalho do site **/
ini_set('zlib.output_compression','On');
ini_set('zlib.output_compression_level','1');
?>
<!doctype html>
<html dir="ltr" lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Comprenssão de dados: gzip, zlib e deflate - Lorindo.com</title>

Ativando o Gzip

Caso você prefira usar o Gzip  ou esteja impedido de usar o Zlib, em servidores linux é possível ativá-lo através do arquivo .htaccess adicionando o código abaixo:


<IfModule mod_deflate.c>
 <IfModule mod_setenvif.c>
 <IfModule mod_headers.c>
 SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding
 RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding
 </IfModule>
 </IfModule>
 <IfModule filter_module>
 FilterDeclare COMPRESS
 FilterProvider COMPRESS DEFLATE resp=Content-Type $text/html
 FilterProvider COMPRESS DEFLATE resp=Content-Type $text/css
 FilterProvider COMPRESS DEFLATE resp=Content-Type $text/plain
 FilterProvider COMPRESS DEFLATE resp=Content-Type $text/xml
 FilterProvider COMPRESS DEFLATE resp=Content-Type $text/x-component
 FilterProvider COMPRESS DEFLATE resp=Content-Type $application/javascript
 FilterProvider COMPRESS DEFLATE resp=Content-Type $application/json
 FilterProvider COMPRESS DEFLATE resp=Content-Type $application/xml
 FilterProvider COMPRESS DEFLATE resp=Content-Type $application/xhtml+xml
 FilterProvider COMPRESS DEFLATE resp=Content-Type $application/rss+xml
 FilterProvider COMPRESS DEFLATE resp=Content-Type $application/atom+xml
 FilterProvider COMPRESS DEFLATE resp=Content-Type $application/vnd.ms-fontobject
 FilterProvider COMPRESS DEFLATE resp=Content-Type $image/svg+xml
 FilterProvider COMPRESS DEFLATE resp=Content-Type $image/x-icon
 FilterProvider COMPRESS DEFLATE resp=Content-Type $application/x-font-ttf
 FilterProvider COMPRESS DEFLATE resp=Content-Type $font/opentype
 FilterChain COMPRESS
 FilterProtocol COMPRESS DEFLATE change=yes;byteranges=no
 </IfModule>
 <IfModule !mod_filter.c>
 AddOutputFilterByType DEFLATE text/html text/plain text/css application/json
 AddOutputFilterByType DEFLATE application/javascript
 AddOutputFilterByType DEFLATE text/xml application/xml text/x-component
 AddOutputFilterByType DEFLATE application/xhtml+xml application/rss+xml application/atom+xml
 AddOutputFilterByType DEFLATE image/x-icon image/svg+xml application/vnd.ms-fontobject application/x-font-ttf font/opentype
 </IfModule>
</IfModule>

Em servidores windows a ativação pode ser feita pelo arquivo web.config, se você tiver o gzip no IIS, adicionando o seguinte código:

<system.webServer>
  <httpCompression directory="%SystemDrive%\inetpub\
temp\IIS Temporary Compressed Files">
    <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll"/>
    <dynamicTypes>
      <add mimeType="text/*" enabled="true"/>
      <add mimeType="message/*" enabled="true"/>
      <add mimeType="application/javascript" enabled="true"/>
      <add mimeType="*/*" enabled="false"/>
    </dynamicTypes>
    <staticTypes>
      <add mimeType="text/*" enabled="true"/>
      <add mimeType="message/*" enabled="true"/>
      <add mimeType="application/javascript" enabled="true"/>
      <add mimeType="*/*" enabled="false"/>
    </staticTypes>
  </httpCompression>
  <urlCompression doStaticCompression="true" doDynamicCompression="true"/>
</system.webServer>

Comprovando o resultado

Com uma ferramenta disponibilizada pelo site Port80 é possível verificar o status da compressão, comparar o tamanho do arquivo original com o do arquivo comprimido e ter uma estimativa de tempo de carregamento da página. Veja o teste que fiz:

verificar compressão gzip
Basta adicionar a url do seu site no campo compression check e clicar em check para fazer o teste com o seu site.
http://www.port80software.com/support/p80tools.asp

Referências

Gzip.org
Zlib.net
Wikipedia.org/Zlib
Wikipedia.org/Gzip
Template de htacess modelo simples focado em seo
Forum Microsoft

  • http://www.facebook.com/conrado.c.silva Conrado Silva

    Cara eu utilizo Microsoft-IIS/7.5 do rede host, mas ainda não consegui achar uma solução, utilizei  http://refresh-sf.com/yui/#output para comprimir, mas não faço a mínima idéia de como configurar lá no server, poderia me ajudar?

    • Wellington Lorindo

      Olá, Conrado! Já tentou pelo web.config como eu falo no post? Essa ferramenta que você citou, o YUI Compressor, é para minificação de arquivos JavaScript/CSS, o que não tem nada a ver com a compressão Gzip. http://en.wikipedia.org/wiki/Minification_(programming)

  • Port80 Support Team

    Olá, Eu trabalho no time de suporte da Port80 Software – obrigada por linkar seu artigo para o nosso site! Além da nossa ferramente de comprenssão de dados, nós oferecemos softwares de Compressão de HTTP, que ajudam a reduzir o tamanho do arquivo e acelerar a velocidade da pagina web.Se vocês tiverem alguma dúvida ou quiserem saber mais sobre os nossos produtos, por favor entrem em contato.

  • http://www.baixenarede.net/ Juninho

    valeu Wellington! Excelente post, me ajudou muito! :)

    • wellingtonlorindo

      :^)

  • Edivaldo

    Olá.
    O .htaccess do meu site tá configurado exatamente assim, conforme abaixo. Só que na URL do artigo não tem o hifem separando as palavras, já nos anúncios as palavras ficam separadas por hifen.

    #RewriteEngine On
    #RewriteCond %{SCRIPT_FILENAME} !-f
    #RewriteCond %{SCRIPT_FILENAME} !-d
    #RewriteRule ^post/(.+)$ post.php?cod=$1
    #RewriteRule ^anuncio/(.+)$ anuncio.php?cod=$1

    RewriteEngine On
    RewriteRule ^(.*)/(.*)/post/?([0-9]*)/?$ /post.php?cod=$3
    RewriteRule post/(.*)/([0-9]*).html/?$ /post.php?cod=$2
    RewriteRule ^(.*)/(.*)/anuncio/?([0-9]*)/?$ /anuncio.php?cod=$3
    RewriteRule anuncio/(.*)/([0-9]*).html/?$ /anuncio.php?cod=$2

    Isso tá causando erro de rastreamento do googlebot, porque as palavras da URL estão separadas apenas com um ESPAÇO. teste%20de%20Host/2.html

    ALGUEM PODE ME AJUDAR?

  • Jackson Rubem

    Parabéns, Lorindo, por fazer um trabalho tão brilhante e esclarecedor. Você demonstra conhecimentos sobre o tema, pois ensina de uma forma clara o que devemos fazer.

    • wellingtonlorindo

      Obrigado pelo comentário, Jackson! =D
      Vou tentar postar mais vezes. Abraço

  • Alexandre Lopes

    Otimo trabalho wellington,

    Mas ainda estou com uma certa dúvida, meu site esta em um servidor windows e nao tem o Gzip instalado e trabaho com ASP tradicional, portando também nao temos o web.config.

    Alguma outra alternativa?

    • wellingtonlorindo

      Obrigado pelo comentário, Alexandre! Talvez tentar habilitar o zlib através do ASP seja uma alternativa, mas sinceramente não sei te dizer pois não sou muito experiente com servidores Windows e não entendo nada de ASP. Abraço

  • prns27

    Olá outro excelente post
    o site esta muito bom!!

  • Francisco silva filho

    Não mostrou o conteúdo do site quando tentei ativar o Zlib