Tag Archives: cache

Smarty e caching – Parte 3

Antes de entrarmos de cabeça em uma das partes que eu acho mais interessante do Smarty Cache, uma coisa que deveria ter sido apresentada no último artigo era como limpar o cache.
Por falta de um lugar melhor, aqui vai.

Como você pode ver temos duas possibilidades, opção 1 permite limpar todos os caches do site em um único comando, e a opção 2 permite que você limpe o cache de um template individual.
Sugiro que você tome um certo cuidado ao utilizar o comando cleal_all_cache() pois em servidores com alta visitação, você repentinamente ter que gerar todos os arquivos de cache pode causar um impacto indesejado no site. Planeje suas mudanças de cache cuidadosamente. Mais nesse assunto depois.

Muitos caches, um template.

Uma das perguntas que eu mais ouvi ser feita (não somente com relação ao artigo mas nas empresas onde trabalhei com Smarty) foi em relação ao controle de de exibição do cache. Vou exemplificar usando o cenário similar ao explicado em um comentário no meu primeiro artigo:

Um template de Menu (menu.tpl) entra no cache. Quando o usuário está logado, o menu muda para não incluir os campos de login e senha, substituindo-os por um link de “logoff”.
Uma típica solução para um cenário desses seria algo assim:

(eu resumi um pouco os códigos, pois já presumo que você saiba fazer o include do Smarty, setar o cache=1 etc….)

O código acima deveria funcionar relativamente bem, porém, ele tem não tão obvio.
O menos obvio é que toda vez que rodamos esse PHP, checamos por uma sessão chamada “id_logado” e decidimos o que fazer a partir dela. Vamos fazer um simulado pra ver o que acontece:
1 – Visitante
– entra ná pagina, ele não tem id_logado, limpa o cache, monta o menu, mostra o display
2 – Novo Visitante
– entra ná pagina, ele tbm não tem “id”, limpamos o cache, monta o menu, e mostra o display
3 – usuario logado – o usuario tá logado, limpamos o cahce, montamos o menu, e mostrams o display.

Bom sem continuar, vemos que de fato, embora estamos usando o cache, na realidade, estamos apenas gerando mais trabalho para o processador, sendo que toda vez estamos limpando o cache. Esquecemos de utilizar o is_cached para checar se o template está cacheado ou não. Então vamos lá:

Agora geramos outro problema: De novo aos testes:
1 – visitante – não tem id, não tem cache, seta valores, mostra display
2 – visitante – nao tem id, o cache existe, mostra display
3 – visitante – nao tem id, o cache existe, mostra display
(legal com o visitante funcionou)
4 – usuario – tem ID, cache existe!, mostra display

Pronto como resolvemos isso? O Smarty guarda o primeiro cache, independente de termos logado ou não… assim todo mundo ve a página com o formulário de login.

Eu demorei, mas é importante que você entenda em detalhe a lógica por trás do Smarty para evitar problemas enquanto desenvolve. É muito comum você(eu ou qualquer um) fazer esse tipo de erro ao desenvolver, e por isso, fazer simulados com pequenos pedaços de código enquanto você desenvolve é importante.

Como resolvemos esse problema? Com cache dinâmico.

O cache dinâmico (por falta de melhor nome), permite você levar em consideração variáveis na hora de cachear seus arquivos. Vamos ao código, depois a explicação:

Tá onde que mudamos? Eu adicionei a variável $logadoID como parâmetro dos metodos is_cached(), clear_cache() e display().
Agora vamos lá aos testes:

1 – visitante – não tem id, não tem cache menu.tpl0, seta valores, mostra display
2 – visitante – nao tem id, o cache menu.tpl0 existe, mostra display
3 – visitante – nao tem id, o cache menu.tpl0 existe, mostra display
4 – usuario 5 – tem ID = 5, o cache menu.tpl5 não existe, seta valores, mostra display
5 – usuario 5 – tem ID = 5, o cache menu.tpl5 existe, mostra display
6 – visitante – nao tem id, o cache menu.tpl0 existe, mostra display
7 – usuario 9 – tem ID = 9, o cache menu.tpl9 não existe, seta valores, mostra display
8 – usuario 5 – tem ID = 5, o cache menu.tpl5 existe, mostra display
8 – usuario 9 – tem ID = 9, o cache menu.tpl9 existe, mostra display

Pelos testes, parece que tudo funcionou!
Eu deixei a linha comentada do clear_cache porque é importante que você veja que no minuto que se usa o cache dinâmico, as funções que trabalham os templates precisam ter o “ID” associadas a elas.
Agora você deve estar perguntando porque eu demorei tanto para explicar algo que tão simples.
Usar o cache dinâmico em certos casos é imprescindível, você não tem como fazer algo assim sem ele, mas um “erro” muito comum dos desenvolvedores de Smarty é sair colocando ID em tudo que é cache. È importante lembrar que todo cache é um arquivo em disco, e que usando o cache dinâmico, você aumenta o número de arquivos existente no seu HD.
Isso pode não parecer um problema muito sério, mas depois de algum tempo, e em um site grande, você pode ter literalmente milhões de arquivos cache. Se você cachear uma página que não muda com um ID, você acabará tendo centenas de milhares de cópias do mesmo arquivo, gastando espaço desnecessariamente.

O Cache dinâmico tem uma funcionalidade bem interessante. É possível apagar todos os caches com um ID=X. Usando o nosso exemplo acima, poderíamos apagar dodos os caches do usuário com ID=9.
Para tal, basta executar o comando:

$Smarty->clear_cache(null, $logadoID);

Bom é isso. No próximo artigo, eu explicarei como funciona o agrupamento de caches, e se der darei alguns casos de uso para vocês terem na cabeça na hora de sair desenvolvendo.

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):

O arquivo PHP (aleatorio.php):

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):

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)

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.

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.