<?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; apache</title>
	<atom:link href="http://www.ataraxia.com.br/posts/tag/apache/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>
	</channel>
</rss>

