Smarty e Caching – Parte 2
Agora que aprendemos um pouco sobre o chaching de uma forma geral, vamos olhar mais a fundo o mundo dentro do Smarty.
Eu geralmente trabalho com um arquivo de configuração geral para o Smarty. Um “smarty.config.php” que eu deixo em algum lugar acessível e fácil. Não vou entrar no mérito de organização de arquivos ou nomenclaturas, padrões de código etc… é apenas uma dica para facilitar a vida.
Bom você já deve estar usando o Smarty e está interessado em habilitar o cache. Para isso, basta setar a variavel “caching” para 1 com a seguinte linha:
$Smarty->caching = 1;
Onde $Smarty é o objeto Smarty que você instanciou antes.
Essa variavelzinha avisa o Smarty que você quer guardar as versões rendidas dos TPLs que você tem.
Vamos ver o que isso significa na prática:
TPL – Arquivo template (aleatorio.tpl):
<html> <head><title>Exemplo 1</title></head> <body>
O número escolhido é: {$aleatorio}
</body> </html>
O arquivo PHP (aleatorio.php):
<?php
// incluir a class smarty
require('Smarty.class.php');
// criar nova instância
$Smarty = new Smarty;
// habilitar o cache
$Smarty->caching = 1; // atribuir um numero aleatorio para variavel aleatorio
$Smarty->assign('aleatorio',rand(1,100));
$Smarty->display('aleatorio.tpl');
?>
Ao rodar essa página a primeira vez, teremos um resultado parecido com esse:
O número escolhido é: 45
Agora toda vez que você rodar sua página no browser, você terá o mesmo resultado (se não, verifique a configuração do seu Smarty, permissão de escrita nos diretórios, etc…)
Com esse simples exemplo, vemos a essência do funcionamento mais básico de cache no Smarty.
Vamos complicar as coisas um pouco. Vamos supor (só por conveniência) que este numero aleatório deve ser alterado a cada 5 minutos. Como que se faz isso?
Uma opção seria caçar o arquivo no cache e apagá-lo manualmente, mas imagino que isso seja um pouco trabalhoso demais.
A outra opção seria avisar o Smarty, que esse cache tem uma vida útil de 5 minutos.
O arquivo PHP (aleatorio5min.php):
<?php
// incluir a class smarty
require('Smarty.class.php');
$Smarty = new Smarty;
$Smarty->caching = 1;
// LINHA NOVA $Smarty->cache_lifetime = 300;
// LINHA NOVA
$Smarty->assign('aleatorio',rand(1,100));
$Smarty->display('aleatorio.tpl');
?>
Agora atribuimos um valor ao atributo “cache_lifetime” (traduzindo: vida util do cache).
Esse parametro recebe um número de segundos que deve ser cacheada uma página.
Agora se rodarmos esse exemplo 4 vezes em intervalos de 4 minutos, teremos:
0:00 – O número escolhido é: 32
0:04 – O número escolhido é: 32
0:08 – O número escolhido é: 78
0:12 – O número escolhido é: 19
(lembrem-se – os números são aleatórios e provavelmente serão diferentes)
Vou entrar em lifetime com mais detalhes em um outro artigo mais avançado, aqui meramente demos uma illustrada na utilidade do conceito.
Importante para o desenvolvedor.
Um dos atributos importantes quando se está usando o Smarty e o Cache, é o atributo:
compile_check
Ele basicamente verifica todos os arquivos envolvidos no template em questão. Se algum deles sofrer alguma modificação, o template é recompilado do Zero.
Isso é importante quando se faz modificações nos templates (tpl). Muitas vezes você irá ter situações onde você faz uma modificação em seu TPL e ela não é refletida no ambiente. Cheque sempre se você tem esse atributo ligado.
Ele é setado usando a linha:
$Smarty->compile_check = true;
Controle de fluxo:
Se você já tem uma certa experiência em programação, você deve ter percebido que do ponto de vista do PHP, nada mudou (peguemos o arquivo aleatorio5min.php)
1. <?php
2. // incluir a class smarty
3. require('Smarty.class.php');
4. $Smarty = new Smarty;
5. $Smarty->caching = 1;
6. $Smarty->cache_lifetime = 300;
7. $Smarty->assign('aleatorio',rand(1,100));
8. $Smarty->display('aleatorio.tpl');
9. ?>
O fluxo permanece o mesmo com e sem o cache. Isso, consequentemente não alivia nosso servidor caso ao invés de buscarmos um numero aleatório, tivessmos fazendo uma conta num banco MySQL ou fazendo um parse de um arquivo XML ou CSV.
Assim, será necessário fazer algumas mudanças no código para usufruir completamente do controle de cache do Smarty.
O que precisamos é verificar se o arquivo tem um cache válido, se ele não o ter, precisamos executar as funções necessárias para popular o template. Caso ele já tenha um arquivo de cache, podemos simplesmente exibir o arquivo cacheado, sem ter que preparar todas as variáveis.
1. <?php
2. // incluir a class smarty
3. require('Smarty.class.php');
4. $Smarty = new Smarty;
5. $Smarty->caching = 1;
6. $Smarty->cache_lifetime = 300;
7. if (!$Smarty->is_cached('aleatorio.tpl')){
8. $Smarty->assign('aleatorio',rand(1,100));
9. }
10. $Smarty->display('aleatorio.tpl');
11. ?>
Como voce pode ver, incluimos uma nova chamada – is_cached(‘arquivo.tpl’).
Essa chamada checa se o nosso cache é válido. Se ele não for (ela retornar false), executamos o nosso assign – no caso o gerador de números aleatórios.
Bom acho que já temos bastante para ir brincando.
Lembrem-se de algumas coisas para manter a vida fácil:
$Smarty->caching = 0; // não faz cache
$Smarty->is_cached(‘arquivo.tpl’) – é importante para controlar o fluxo de dados no servidor
No próximo artigo, vamos ver em mais detalhes como cachear resultados dinâmicos. Isso é algo que já me perguntaram, mas o assunto é muito comprido para deixar em um só artigo.

