Usando ETag para otimizar cache em páginas PHP dinâmicas

Ilustração de cabeçalhos HTTP

Desenvolvi nas últimas semanas o uso de ETag nas páginas e posts do site, gerados dinamicamente por PHP no WordPress. Os arquivos estáticos, como imagens e arquivos JavaScript e CSS já usam o recurso pelo servidor Nginx.

As ETags, também chamadas de Entity Tags (ou tags de entidade), são respostas em cabeçalhos HTTP que identificam uma versão específica de um recurso. Isso melhora o uso de cache e poupa recursos, já que o servidor não precisa enviar o documento inteiro se ele não foi alterado.

O repositório está disponível no meu GitHub. Você pode usar em qualquer tema para WordPress, incluindo o Evolution, ou adaptar o código para outras aplicações em PHP.

Como o script cria a ETag?

Neste site, as ETags são basicamente geradas agrupando duas informações.

Primeiro, o script verifica quando o conteúdo da página foi modificado pela última vez. Esta informação pode ser a data e hora da última edição do post ou da página, ou a data e hora do último comentário na página em questão. A informação mais recente será a considerada.

Em segundo vem o conteúdo da própria página. Um hash é criado com base em todo o HTML gerado ao usuário, usando o recurso de output buffer do PHP.

Qualquer modificação do conteúdo é considerado. Dessa forma, instalação de novos plugins, edições nos menus de navegação e, claro, alterações no post resultarão em uma ETag diferente.

Como o script valida a Entity Tag?

Com a ETag criada, o script checa primeiramente se o usuário não está logado no painel administrativo do WordPress. Isso é necessário para evitar que a página fique gravada em cache durante a visualização de mudanças no conteúdo, como edição de páginas, posts e códigos PHP.

O script então verifica se o cabeçalho ETag em cache é igual ao que foi gerado na requisição, usando tanto validadores fracos e fortes.

Se os dados atendem a todos os requisitos, o script retorna o código de resposta HTTP 304 Not Modified (não modificado). Portanto, o browser mostrará ao usuário a versão em cache da página, salvando assim tráfego de rede e otimizando o carregamento.

Avatar de Matheus Misumoto