<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Ataraxia! &#187; tutorial</title>
	<atom:link href="http://www.ataraxia.com.br/posts/category/tutorial/feed" rel="self" type="application/rss+xml" />
	<link>http://www.ataraxia.com.br</link>
	<description>O estado da arte em TI</description>
	<lastBuildDate>Sun, 17 Jul 2011 21:36:57 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Otimização de sites, parte 3 &#8211; Cache</title>
		<link>http://www.ataraxia.com.br/posts/otimizacao-de-sites-parte-3-cache</link>
		<comments>http://www.ataraxia.com.br/posts/otimizacao-de-sites-parte-3-cache#comments</comments>
		<pubDate>Wed, 15 Apr 2009 12:42:12 +0000</pubDate>
		<dc:creator>Bruno Lustosa</dc:creator>
				<category><![CDATA[dicas]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[otimização]]></category>

		<guid isPermaLink="false">http://www.ataraxia.com.br/?p=259</guid>
		<description><![CDATA[Nos outros dois artigos sobre otimização, já vimos como diminuir o número de requisições usando o Minify e também como diminuir o tamanho dos arquivos transferidos usando compressão. Neste artigo, apresentarei mais uma forma de se conseguir diminuir mais ainda o tempo de carga de uma página, usando a técnica de caching. Como o cache [...]]]></description>
			<content:encoded><![CDATA[<p>Nos outros dois artigos sobre otimização, já vimos <a href="http://www.ataraxia.com.br/posts/otimizacao-em-php-parte-1-minify">como diminuir o número de requisições usando o Minify</a> e também como <a href="http://www.ataraxia.com.br/posts/otimizacao-de-sites-parte-2-compressao">diminuir o tamanho dos arquivos transferidos usando compressão</a>.<br />
Neste artigo, apresentarei mais uma forma de se conseguir diminuir mais ainda o tempo de carga de uma página, usando a técnica de <em>caching</em>.</p>
<h2>Como o cache pode ajudar?</h2>
<p>Nos outros artigos, vimos como diminuir o número de requisições (agrupando vários arquivos em um só) e também como diminuir o tamanho do que é transferido.<br />
Mas&#8230; e se não precisarmos fazer todas essas requisições? A grande maioria das páginas de um site tem arquivos em comum, e que não mudam. Imagens estáticas, folhas de estilo CSS e scripts em JavaScript. E após a primeira carga, o navegador já vai ter esses arquivos localmente.<br />
Só nos resta dizer pra ele quando e o que ele pode usar nas requisições seguintes.</p>
<h2>Quais as formas de se usar o cache?</h2>
<p>Uma vez que o navegador tenha, digamos, uma imagem estática em cache, existem duas formas dele proceder pra saber se o arquivo é atual ou não.<br />
A primeira é fazer uma requisição indicando a data em que o arquivo foi buscado. Essa requisição é feita enviando um cabeçalho &#8220;If-Modified-Since&#8221;, com a data do arquivo local. Caso o arquivo não tenha sido modificado, o servidor responde com o código 304 (Not Modified) ao invés de devolver o arquivo novamente.<br />
A segunda forma é somente pedir o arquivo caso ele já tenha expirado.<br />
Logicamente a segunda forma é bem mais econômica, pois evita a abertura da conexão.<br />
Porém, temos um problema: como saber se um arquivo já expirou?</p>
<h2>O cabeçalho &#8220;Expires&#8221;</h2>
<p>Qualquer arquivo solicitado em uma conexão HTTP pode ter associado um cabeçalho <em>Expires</em>, que indica explicitamente a &#8220;data de vencimento&#8221; daquele arquivo. Ou seja, até a data especificada, o arquivo é válido e não precisa ser checado novamente. Após isso, o navegador deve considerar o arquivo como expirado, e solicitar novamente.<br />
Então, para arquivos estáticos, podemos colocar uma regra dizendo que a data de vencimento dele é em um futuro distante. Isso pode ser feito, em um servidor Apache, com uma regra semelhante a esta:</p>

<div class="wp_syntax"><div class="code"><pre class="apache" style="font-family:monospace;"><span style="color: #00007f;">ExpiresActive</span> <span style="color: #0000ff;">On</span>
<span style="color: #00007f;">ExpiresByType</span> image/gif <span style="color: #7f007f;">&quot;access plus 5 years&quot;</span>
<span style="color: #00007f;">ExpiresByType</span> image/jpeg <span style="color: #7f007f;">&quot;access plus 5 years&quot;</span>
<span style="color: #00007f;">ExpiresByType</span> image/png <span style="color: #7f007f;">&quot;access plus 5 years&quot;</span>
<span style="color: #00007f;">ExpiresByType</span> text/css <span style="color: #7f007f;">&quot;access plus 5 years&quot;</span></pre></div></div>

<p>Neste exemplo (que utilizo aqui neste site), estou indicando explicitamente que arquivos do tipo GIF, JPEG, PNG e CSS tem validade de 5 anos da data do download. Antes disso, o navegador pode assumir que o conteúdo é atual e utilizá-lo.<br />
Deixei o JavaScript de lado porque atualmente não estou utilizando nenhum script neste site. Caso queira adicionar na lista, basta duplicar uma das linhas, usando o tipo <em>text/javascript</em>.<br />
Após o primeiro acesso, todas as imagens e folhas de estilo serão cacheadas, e o navegador não irá solicitá-las novamente. Isso dá um bom ganho de desempenho, pois o número de requisições necessárias para carregar as páginas subsequentes (e o correspondente tamanho em bytes) cai consideravelmente.</p>
<h2>O resultado</h2>
<p>Tomando como exemplo a <a href="http://www.ataraxia.com.br/">página inicial deste site</a>, e testando com um navegador com o cache completamente limpo, temos, para o primeiro acesso 21 conexões, sendo 1 para a página propriamente dita, 3 arquivos CSS externos, e 17 imagens externas.<br />
Em um segundo acesso à mesma página (cliquei no logotipo lá em cima à esquerda), apenas uma única conexão foi aberta, para baixar somente a página em si. Todas as imagens e folhas de estilo já estavam no cache do navegador, e ele &#8220;sabe&#8221; que elas só vão expirar daqui a 5 anos. Logo, não tem porque verificar se foram alteradas.</p>
<h2>Possíveis problemas</h2>
<p>Um dos problemas neste tipo de configuração é o que fazer caso se precise fazer uma alteração em uma imagem ou em um arquivo CSS.<br />
Nesses casos, como o navegador não está nem checando, o melhor a fazer é alterar o nome do arquivo, por exemplo, colocando um número contendo a versão ou a data de modificação. Com isso, o navegador irá interpretar o arquivo como algo novo, que ele ainda não possui em cache, e que precisa ser baixado.<br />
Porém, o ganho que se consegue com o uso dessa técnica faz, na minha opinião, valer a pena o esforço. Existem algumas formas de se automatizar o processo de alteração do nome do arquivo, que deixarei para discutir em um outro artigo.</p>
<h3  class="related_post_title">Artigos relacionados</h3><ul class="related_post"><li><a href="http://www.ataraxia.com.br/posts/otimizacao-de-sites-parte-2-compressao" title="Otimização de sites, parte 2 &#8211; Compressão">Otimização de sites, parte 2 &#8211; Compressão</a></li><li><a href="http://www.ataraxia.com.br/posts/otimizacao-em-php-parte-1-minify" title="Otimização em PHP, parte 1: Minify">Otimização em PHP, parte 1: Minify</a></li><li><a href="http://www.ataraxia.com.br/posts/otimizacao-de-sites-com-memcached" title="Otimização de sites com memcached">Otimização de sites com memcached</a></li><li><a href="http://www.ataraxia.com.br/posts/otimizacao-imagens-inline" title="Otimização: imagens inline">Otimização: imagens inline</a></li><li><a href="http://www.ataraxia.com.br/posts/paginas-de-manutencao" title="Páginas de manutenção">Páginas de manutenção</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.ataraxia.com.br/posts/otimizacao-de-sites-parte-3-cache/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Criando CAPTCHAs em PHP</title>
		<link>http://www.ataraxia.com.br/posts/criando-captchas-em-php</link>
		<comments>http://www.ataraxia.com.br/posts/criando-captchas-em-php#comments</comments>
		<pubDate>Sun, 12 Apr 2009 03:06:23 +0000</pubDate>
		<dc:creator>Bruno Lustosa</dc:creator>
				<category><![CDATA[programação]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[captcha]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[segurança]]></category>

		<guid isPermaLink="false">http://www.ataraxia.com.br/?p=236</guid>
		<description><![CDATA[Após postar a galeria dos 10 piores CAPTCHAs do mundo, estou postando o artigo prometido sobre como criar um CAPTCHA em PHP. Como já dito antes, a função de um CAPTCHA é apresentar um problema de fácil solução para um ser humano, mas de difícil resolução por um computador. Normalmente, os CAPTCHAs tomam a forma [...]]]></description>
			<content:encoded><![CDATA[<p>Após postar a <a href="http://www.ataraxia.com.br/posts/os-10-piores-captchas-do-mundo">galeria dos 10 piores CAPTCHAs do mundo</a>, estou postando o artigo prometido sobre como criar um CAPTCHA em PHP.<br />
Como já dito antes, a função de um <acronym title="Completely Automated Public Turing test to tell Computers and Humans Apart">CAPTCHA</acronym> é apresentar um problema de fácil solução para um ser humano, mas de difícil resolução por um computador. Normalmente, os CAPTCHAs tomam a forma de imagens com letras distorcidas, e é exatamente este o tipo que iremos criar neste artigo.</p>
<h2>Como funciona na teoria?</h2>
<p>O funcionamento de um CAPTCHA de letras tortas é bem simples. O servidor gera uma string que será transformada em uma imagem. A string é salva em algum lugar (normalmente em uma variável de sessão). A imagem é apresentada dentro de um formulário. Ao submeter o formulário, o script checa se o que o usuário digitou bate com o conteúdo da variável de sessão. Se bater, o usuário passou no teste.<br />
Na teoria, tudo muito simples.</p>
<h2>Mas e na prática?</h2>
<p>Na prática, tudo também pode ser igualmente simples. Ao invés de reinventar a roda, podemos utilizar uma classe chamada <a href="http://www.phpcaptcha.org/">Securimage</a>, que serve justamente para gerar CAPTCHAs.</p>
<h2>Securimage</h2>
<p>Securimage é uma classe em PHP que utiliza a biblioteca gráfica GD para gerar imagens com CAPTCHAs. A classe é bastante versátil, e suporta várias opções, como fontes <acronym title="TrueType Font">TTF</acronym>, imagens de fundo, linhas, arcos e bem mais.<br />
O primeiro passo é baixar o pacote com a <a href="http://www.phpcaptcha.org/download/">versão mais recente</a> e descompactá-lo em algum lugar. A partir deste ponto, vou assumir que o pacote foi descompactado em uma pasta chamada &#8220;securimage&#8221; no diretório raiz do site.</p>
<h2>Criando o form com a imagem</h2>
<p>Dentro do formulário que se deseja proteger, colocamos uma tag <b>img</b>, que irá conter a imagem gerada pelo Securimage:</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">img</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;captcha&quot;</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;/securimage/securimage_show.php&quot;</span> <span style="color: #000066;">alt</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;CAPTCHA&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span></pre></div></div>

<p>Este script <b>securimage_show.php</b> é bem pequeno (3 linhas), e irá criar um CAPTCHA com as opções padrões da classe. Veremos mais adiante algumas formas de se customizar a imagem.<br />
Além da imagem, também precisamos de um campo para o usuário digitar as letras contidas na imagem:</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;captcha_txt&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span></pre></div></div>

<p>E com isso o formulário está pronto.</p>
<h2>A checagem no backend</h2>
<p>O usuário viu a imagem, digitou os dados e submeteu o formulário. Agora é hora de checar se o código digitado bate com o texto contido na imagem.<br />
Logo no início do script que recebe os dados do formulário (em caso de dúvida, veja o atributo <b>action</b> da tag <b>form</b>), é preciso inicializar as variáveis de sessão:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #990000;">session_start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>É importante que este código venha antes de qualquer saída, ou teremos um erro do tipo &#8220;Cannot modify header information &#8211; headers already sent&#8230;.&#8221;. Na dúvida, coloque logo no início.<br />
O restante da checagem é bastante simples. Basta instanciarmos um objeto da classe Securimage e chamar um método que faz a checagem:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #b1b100;">require_once</span> <span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'DOCUMENT_ROOT'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'/securimage/securimage.php'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$securimage</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Securimage<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$securimage</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">check</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'captcha_txt'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #666666; font-style: italic;">// Código digitado corretamente</span>
    <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Ok, o código foi digitado corretamente.&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #666666; font-style: italic;">// Código digitado não bate com a imagem</span>
    <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Erro: código incorreto.&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>O exemplo acima apenas ilustra como é feita a checagem. As chamadas a <b>die()</b> devem ser substituídas de acordo com a lógica da página onde o CAPTCHA está sendo inserido. No caso do código estar correto, deve-se prosseguir com o processamento do formulário, e caso não esteja, possivelmente exibir novamente o formulário com uma mensagem de erro. Será gerado um novo CAPTCHA automaticamente.</p>
<h2>Outras opções</h2>
<p>Como dito anteriormente, a classe é bastante versátil, e suporta diversas opções para a geração das imagens. Todas as opções estão descritas na <a href="http://www.phpcaptcha.org/Securimage_Docs/Securimage/classes/Securimage.html">documentação da classe</a>, mas vou transcrever várias das opções aqui.<br />
Para se customizar a imagem, basta editar diretamente o script <b>securimage_show.php</b>, que é o script usado na tag <b>img</b>. Originalmente, ele é apenas o seguinte:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #b1b100;">include</span> <span style="color: #0000ff;">'securimage.php'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$img</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> securimage<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$img</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">show</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Podemos passar opções para a classe antes de chamar o método <b>show()</b>. Apenas para ilustrar, aqui vai um exemplo bem customizado:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #b1b100;">include</span> <span style="color: #0000ff;">'securimage.php'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$img</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> securimage<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$img</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">code_length</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">8</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// 8 ao invés de apenas 4 caracteres</span>
<span style="color: #000088;">$img</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">charset</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;AEIOU&quot;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Apenas vogais</span>
<span style="color: #000088;">$img</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">image_width</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">280</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Padrão é 175px para 4 caracteres</span>
<span style="color: #000088;">$img</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">multi_text_color</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;#ff0000,#0000ff&quot;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Letras azuis e vermelhas</span>
<span style="color: #000088;">$img</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">image_bg_color</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;#ffff00&quot;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Fundo amarelo</span>
<span style="color: #000088;">$img</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">show</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>E abaixo, 3 exemplos de CAPTCHAs gerados por este script:</p>
<p><img src="http://www.ataraxia.com.br/wp-content/uploads/2009/04/11.png" alt="CAPTCHA - Exemplo 1" title="CAPTCHA - Exemplo 1" width="280" height="45" class="alignnone size-full wp-image-251" /><br />
<img src="http://www.ataraxia.com.br/wp-content/uploads/2009/04/21.png" alt="CAPTCHA - Exemplo 2" title="CAPTCHA - Exemplo 2" width="280" height="45" class="alignnone size-full wp-image-252" /><br />
<img src="http://www.ataraxia.com.br/wp-content/uploads/2009/04/31.png" alt="CAPTCHA - Exemplo 3" title="CAPTCHA - Exemplo 3" width="280" height="45" class="alignnone size-full wp-image-253" /></p>
<p>Como já dito, a classe suporta muitas outras opções, o melhor mesmo é ler a documentação caso se deseje customizar mais.</p>
<h3  class="related_post_title">Artigos relacionados</h3><ul class="related_post"><li><a href="http://www.ataraxia.com.br/posts/evitando-sql-injection-em-php" title="Evitando SQL injection em PHP">Evitando SQL injection em PHP</a></li><li><a href="http://www.ataraxia.com.br/posts/os-10-piores-captchas-do-mundo" title="Os 10 piores CAPTCHAs do mundo">Os 10 piores CAPTCHAs do mundo</a></li><li><a href="http://www.ataraxia.com.br/posts/seguranca-no-envio-de-emails" title="Segurança no envio de emails em PHP">Segurança no envio de emails em PHP</a></li><li><a href="http://www.ataraxia.com.br/posts/agendando-eventos-no-wordpress" title="Agendando eventos no WordPress">Agendando eventos no WordPress</a></li><li><a href="http://www.ataraxia.com.br/posts/removendo-o-generator-do-wordpress" title="Removendo o &#8220;generator&#8221; do Wordpress">Removendo o &#8220;generator&#8221; do Wordpress</a></li><li><a href="http://www.ataraxia.com.br/posts/escrevendo-plugins-para-o-wordpress" title="Escrevendo plugins para o Wordpress">Escrevendo plugins para o Wordpress</a></li><li><a href="http://www.ataraxia.com.br/posts/pegadinhas-no-php" title="Pegadinhas no PHP">Pegadinhas no PHP</a></li><li><a href="http://www.ataraxia.com.br/posts/otimizacao-em-php-parte-1-minify" title="Otimização em PHP, parte 1: Minify">Otimização em PHP, parte 1: Minify</a></li><li><a href="http://www.ataraxia.com.br/posts/precedencia-no-php" title="Precedência no PHP">Precedência no PHP</a></li><li><a href="http://www.ataraxia.com.br/posts/evitando-spam-em-formularios" title="Evitando spam em formulários">Evitando spam em formulários</a></li><li><a href="http://www.ataraxia.com.br/posts/imprimindo-em-formularios-continuos-em-php" title="Imprimindo em formulários contínuos em PHP">Imprimindo em formulários contínuos em PHP</a></li><li><a href="http://www.ataraxia.com.br/posts/xml-no-php-com-xml_serializer-parte-2-de-2" title="XML no PHP com XML_Serializer, parte 2 de 2">XML no PHP com XML_Serializer, parte 2 de 2</a></li><li><a href="http://www.ataraxia.com.br/posts/xml-no-php-com-xml_serializer-parte-1-de-2" title="XML no PHP com XML_Serializer, parte 1 de 2">XML no PHP com XML_Serializer, parte 1 de 2</a></li><li><a href="http://www.ataraxia.com.br/posts/envio-de-emails-em-php" title="Envio de emails em PHP">Envio de emails em PHP</a></li><li><a href="http://www.ataraxia.com.br/posts/validacao-de-dados-em-php" title="Validação de dados em PHP">Validação de dados em PHP</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.ataraxia.com.br/posts/criando-captchas-em-php/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Otimização de sites, parte 2 &#8211; Compressão</title>
		<link>http://www.ataraxia.com.br/posts/otimizacao-de-sites-parte-2-compressao</link>
		<comments>http://www.ataraxia.com.br/posts/otimizacao-de-sites-parte-2-compressao#comments</comments>
		<pubDate>Tue, 10 Mar 2009 03:21:36 +0000</pubDate>
		<dc:creator>Bruno Lustosa</dc:creator>
				<category><![CDATA[dicas]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[otimização]]></category>

		<guid isPermaLink="false">http://www.ataraxia.com.br/?p=201</guid>
		<description><![CDATA[Como vimos no primeiro artigo da série sobre otimização em PHP, minimizar o número de conexões feitas pelo navegador é algo fundamental, pois muitas vezes perdemos mais tempo para estabelecer as conexões HTTP do que baixando o conteúdo propriamente dito. Porém, tão importante quanto minimizar o número de conexões, é ter certeza de que a [...]]]></description>
			<content:encoded><![CDATA[<p>Como vimos no <a href="http://www.ataraxia.com.br/posts/otimizacao-em-php-parte-1-minify">primeiro artigo da série sobre otimização em PHP</a>, minimizar o número de conexões feitas pelo navegador é algo fundamental, pois muitas vezes perdemos mais tempo para estabelecer as conexões <acronym title="HyperText Transfer Protocol">HTTP</acronym> do que baixando o conteúdo propriamente dito.</p>
<p>Porém, tão importante quanto minimizar o número de conexões, é ter certeza de que a quantidade de dados transferidos seja sempre a menor possível. Como vimos antes, o Minify já ajuda nesse sentido, pois retira dos scripts e das folhas de estilo caracteres desnecessários como espaços em branco e quebras de linha.</p>
<p>Este artigo não é específico de PHP, pois lida uma camada abaixo, direto no protocolo HTTP. As soluções apresentadas aqui podem ser implementadas diretamente na linguagem, mas ficam bem melhores se implementadas no servidor (Apache, no caso), como demonstrado neste artigo.</p>
<p>Começando com o HTTP 1.1, os navegadores podem especificar formas de codificação aceitáveis para o conteúdo, através do cabeçalho <em>Accept-Encoding</em>. Por exemplo, utilizando:</p>

<div class="wp_syntax"><div class="code"><pre class="http" style="font-family:monospace;">Accept-Encoding: gzip, deflate</pre></div></div>

<p>o navegador indica para o servidor web que pode receber o conteúdo solicitado de forma comprimida, utilizando um destes dois métodos (gzip ou deflate). Caso o servidor possa comprimir utilizando uma das formas solicitadas, irá retornar um cabeçalho <em>Content-Encoding</em>, informando a codificação usada, como por exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="http" style="font-family:monospace;">Content-Encoding: gzip</pre></div></div>

<p>A codificação mais popular hoje em dia é o gzip, que é uma especificação aberta e bem documentada pela <a href="http://www.ietf.org/rfc/rfc1952.txt">RFC 1952</a>. A outra codificação (deflate) também pode ser usada, mas é menos popular e menos eficiente que o gzip.</p>
<p>A codificação gzip consegue comprimir conteúdo texto (HTML, CSS, JavaScript, e outros) em aproximadamente 70%. Levando-se em consideração que mais de 90% dos navegadores atualmente em uso suportam esta compressão, é altamente recomendável configurar o servidor web para comprimir arquivos texto.</p>
<p>Para o <a href="http://apache.httpd.org/">Apache</a>, dependerá da versão utilizada. O Apache 1.3 utiliza o <a href="http://sourceforge.net/projects/mod-gzip/">mod_gzip</a>, enquanto que o Apache 2.x usa o <a href="http://httpd.apache.org/docs/2.0/mod/mod_deflate.html">mod_deflate</a>. Como o Apache 1.3 já não é muito utilizado, vou mostrar os exemplos  para o mod_deflate.</p>
<p>Devemos levar em conta que somente arquivos texto devem ser comprimidos. Arquivos binários, como imagens, áudio e vídeo em geral já estão em um formato comprimido, e colocar mais compressão em cima, além de não diminuir o tamanho do arquivo (pelo contrário, as vezes até aumenta!), causa também desperdício de CPU para o servidor.</p>
<p>A configuração do mod_deflate em geral é feita especificando quais tipos de arquivo serão comprimidos. Em geral, arquivos texto devem ser comprimidos. Podemos, por exemplo, especificar que alguns tipos devem ser comprimidos utilizando diretivas de Apache como:</p>

<div class="wp_syntax"><div class="code"><pre class="apache" style="font-family:monospace;"><span style="color: #00007f;">SetOutputFilter</span> DEFLATE
<span style="color: #00007f;">AddOutputFilterByType</span> DEFLATE text/html text/plain text/xml text/css text/javascript text/x-json</pre></div></div>

<p>A primeira linha liga o mecanismo de compressão do mod_deflate, e a segunda especifica alguns tipos que devem ser comprimidos. No caso, estou informando ao servidor que arquivos tipo <acronym title="HyperText Markup Language">HTML</acronym>, texto puro, <acronym title="eXtensible Markup Language">XML</acronym>, <acronym title="Cascading Style Sheet">CSS</acronym>, JavaScript e <acronym title="JavaScript Object Notation">JSON</acronym> devem ser comprimidos. Alguns navegadores mais antigos podem ter problemas com a compressão gzip, mas felizmente isto é coisa do passado. De qualquer forma, a página com a documentação do mod_deflate mostra como desligar a compressão de acordo com o navegador usado.</p>
<p>Um bom site para se testar se o servidor está configurado corretamente para servir conteúdo comprimido é o <a href="http://whatsmyip.org/mod_gzip_test/">mod_gzip Test</a>. Basta colocar a <acronym title="Uniform Resource Locator">URL</acronym> do site e clicar em &#8220;Test&#8221; para saber se o servidor está preparado para servir conteúdo comprimido.</p>
<h3  class="related_post_title">Artigos relacionados</h3><ul class="related_post"><li><a href="http://www.ataraxia.com.br/posts/otimizacao-em-php-parte-1-minify" title="Otimização em PHP, parte 1: Minify">Otimização em PHP, parte 1: Minify</a></li><li><a href="http://www.ataraxia.com.br/posts/otimizacao-de-sites-parte-3-cache" title="Otimização de sites, parte 3 &#8211; Cache">Otimização de sites, parte 3 &#8211; Cache</a></li><li><a href="http://www.ataraxia.com.br/posts/envio-de-emails-em-massa" title="Envio de emails em massa">Envio de emails em massa</a></li><li><a href="http://www.ataraxia.com.br/posts/otimizacao-de-sites-com-memcached" title="Otimização de sites com memcached">Otimização de sites com memcached</a></li><li><a href="http://www.ataraxia.com.br/posts/otimizacao-imagens-inline" title="Otimização: imagens inline">Otimização: imagens inline</a></li><li><a href="http://www.ataraxia.com.br/posts/acessando-sites-fora-do-ar" title="Acessando sites fora do ar">Acessando sites fora do ar</a></li><li><a href="http://www.ataraxia.com.br/posts/paginas-de-manutencao" title="Páginas de manutenção">Páginas de manutenção</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.ataraxia.com.br/posts/otimizacao-de-sites-parte-2-compressao/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

