Smarty e Caching

Monday, June 30, 2008
By PHPSP Administrator

O artigo a seguir foi publicado originalmente por Gregory Brown no site http://elbugz.livejournal.com/1034.html

As informações disponibilizadas neste artigo são de responsabilidade de Gregory Brown do site http://elbugz.livejournal.com/

O Smarty é conhecido mais como um “Template engine” do que um “caching engine”. Embora a documentação fale sobre o cache, ele é pouco utilizado pelas pessoas e tende-se a pensar nele mais como uma ferramenta de exibição do qualquer outra coisa.

Vamos do começo…

O que é esse tal de caching engine?

Quando você faz um código php simples, por exemplo:

pag: exemplo1.php
<?php
for ($i=0;$i<5;$i++){
echo “$i – Linha repetida.<br />\r\n”;
}
?>
Ao rodar ele, o resultado será:

0 – Linha repetida.<br />
1 – Linha repetida.<br />
2 – Linha repetida.<br />
3 – Linha repetida.<br />
4 – Linha repetida.<br />

Toda vez que você acessar a página exemplo1.php, o que acontece é:

1 – seu servidor HTTP pede para o PHP interpretar o código-fonte do exemplo1.php
2 – o PHP lê o arquivo e processa as instruções nele
3 – ele cospe o resultado de volta para o servidor web
4 – o servidor web manda pra você.

Tá, legal, e daí? Você pergunta?

Aqui que entra o Caching-engine.

Um Caching engine permite você fazer algo um pouco diferente:

Toda vez que você acessar a página exemplo1.php, o que acontece é:

1 – seu servidor HTTP pede para o PHP interpretar o código-fonte do exemplo1.php
2 – o PHP lê o arquivo e processa as instruções nele
3 – o Caching-Engine (CE) verifica se existe uma versão já pronta da página
3a – se não tiver, ele executa as operações do for
3b – tem, lê o arquivo do disco.
4 – ele cospe o resultado de volta para o servidor web
5 – o servidor web manda pra você.

OK, então um caching engine basicamente cria uma cópia rendida de um arquivo pronto. Parece ser balela inútil, principalmente com um exemplo tão tosco e simples como um “for”.

Agora extrapolemos….

Imagine uma página que lê uma tabela de log do seu banco. Esses dados pegam o resultado estatístico a cada hora. Porque seu site tem muitas visitas, o LOG é bem extenso, e as queries demoram uns 2 segundos pra responder. Agora não só a query demora uns dois segundos pra responder, mas você ainda precisa fazer uma série de contas e cálculos complexos com os dados que são produzidos pela query.
Sua página agora demora uns 3 segundos pra responder, e nesse meio tempo, o processadordo servidor  fica próximos dos 75%.

Você pergunta “tá e?”.

Agora lembre-se que seu servidor tem acessos pra caramba. Imagine 1000 usuários solicitando a mesma página em 1 minuto? O site trava, bomba, cai ou qualquer outra terminologia que você queira atribuir a esse acontecimento.

Se você utilizar um CE, o processamento ocorre somente uma vez, na primeira solicitação. Uma cópia do resultado é arquivado, e os outros 999 usuários vão estar vendo um HTML e não um PHP processado realtime.

Resultado? Seu site não cai, os outros serviços continuam livres para usar o processador.

  • http://www.eciovirgilio.com.br Ecio

    Mas oq acontece se houver estruturas IF no smarty (pra tratar o perfil d usuario por exemplo) e uma mesma página possa trazer resultados diferentes dependendo da ocasiao, e essa pagina nao for interpretada mas apenas recuperada do cache? BOOMM

    Já aconteceu comigo de, por exemplo, ter um menu que se o usuario estivesse logado com perfil d administrador aparecer um determinado item no menu… mas como a pagina foi cacheada, usuarios sem perfil administrativo visualizavam esse link.

  • http://elbugz.livejournal.com ElBugz

    Na verdade esse tópico eu vou cobrir em detalhes no terceiro ou quarto artigo (sim tem tanta coisa para se falar de cache), mas só pra te dar uma prévia…
    O Smarty permite você gravar cache com identificadores. Usando seu exemplo (não vou entrar em detalhes técnicos, só teóricos aqui):
    Você faria o cache do menu assim:
    menu.tpl|statusLogado
    assim, na página que carrega o menu, você pegaria setaria a variável statusLogado para true ou false. Essencialmente, criando duas versões do cache, uma para usuários logados e outra para usuários não logados.
    Meio complicado explicar assim, mas vou chegar lá nos artigos.

  • http://www.alexandretaz.blog.br Alexandre “TAZ”

    A questão é que podemos usar o método de cache para determinadas páginas apenas o que resolve o problema do caching em todo o site.

  • http://elbugz.livejournal.com ElBugz

    TAZ, isso é verdade, porém, não necessariamente bom. Mais dois artigos estão em vias de serem publicados aqui (já tem a versão deles no meu site) que explica em detalhes como usar o cache do Smarty evitando esse tipo de problema.
    Falta ainda concluir o tutorial, e prometo que tento fazer isso ainda essa semana.