Strict Standards: Non-static method themeGluedIdeas_Subtle::initOptions() should not be called statically in /home/riopro/www/blog.riopro.com.br/wp-content/themes/gluedideas_subtle/header.php on line 19
Riopro Blog - » Expirando fragment cache por tempo

Expirando fragment cache por tempo



Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /home/riopro/www/blog.riopro.com.br/wp-includes/formatting.php on line 82

Apesar de estar no meu nome, esse artigo foi escrito a quatro mãos com o Rodrigo.

Recentemente acrescentamos uma lista de últimos artigos do blog do VoteBolsa na página home do site. Para isso fizemos um parser do feed rss do blog e tratamos ele para aparecer de forma agradável no lado direito da página. Até aí, nada demais. Afinal, quantos sites não tem isso?

Depois do parser, outra necessidade era impedir que todas as visitas à página do VoteBolsa gerassem uma solicitação ao feed RSS. Isso porque o custo de acessar, baixar o feed e parsear o mesmo a cada solicitação era algo desnecessário, visto que os artigos do blog não sofrem alterações a todo momento. A solução inicial foi fazer um fragment cache da view que exibia os últimos artigos do blog, colocando no controller:

unless read_fragment({})
@blog_articles = RssReader.parseFeed("http://blog.votebolsa.com.br/feed/", 3)
end

e na view:

<% cache do %>
<div class="blog_box">
<div class="blog_label">
Blog VoteBolsa
</div>
<div class="blog_articles">
<% for article in @blog_articles %>
<p><%= link_to article[:title], article[:link] %></p>
<% end %>
</div>
</div>
<% end %>

O problema que ficou foi de como expirar a lista de últimos artigos do blog. Normalmente, se tivessemos cacheando, por exemplo, um modelo da nossa aplicação (como uma lista dos usuários mais bem ranqueados no mês), criaríamos um sweeper para que, cada vez que o objeto sendo cacheado fosse modificado, o cache expirasse. Exemplo:

# Expirando o cache
expire_fragment(:controller => 'NOME_DO_CONTROLLER', :action => 'NOME_DA_ACTION')

Só que, nesse caso, o blog não faz parte da aplicação. Ele usa o Wordpress (em php). Por isso, não conseguíamos verificar as mudanças. A melhor forma seria colocar uma tempo para expirar o fragment cache. Essa opção não está disponível entre as funcionalidades do fragment cache.

Dado que o cache não era uma opção, mas uma necessidade, começamos a procurar plugins simples que realizassem as modificações desejadas. E encontramos o TimedCacheFragment. Colocando o mesmo na pasta de plugin, restava apenas a implementação do plugin na nossa aplicação. Simples e direto ao ponto, a implementação ficou assim:

no controller:

if is_cache_expired?(’NOME_DO_MEU_CACHE’)
@blog_articles = RssReader.parseFeed(”http://blog.votebolsa.com.br/feed/”, 3)
else
@blog_articles = []
end

na view:

<% cache_timeout(’NOME_DO_MEU_CACHE’, 4.hours.from_now) do %>
<div class=”blog_box”>
<div class=”blog_label”>
Blog VoteBolsa
</div>
<div class=”blog_articles”>
<% for article in @blog_articles %>
<p><%= link_to article[:title], article[:link] %></p>
<% end %>
</div>
</div>
<% end %>

Pronto. O nosso cache agora expira a cada 4 horas. Para testar o caching no ambiente de development, não se esqueça de modificar seu development.rb de :

config.action_controller.perform_caching = false

para:

config.action_controller.perform_caching = true

Esperamos que o TimedCacheFragment seja útil para você também. Se não for, indique sua sugestão de implementação nos comentários para que possamos avaliar também.

Esse artigo não pretendeu ser um artigo abrangente sobre cache no Rails. Para isso indicamos 2 bons artigos do Rails Envy: Ruby on Rails Caching Tutorial e Ruby on Rails Caching Tutorial - Part 2.

Informações e Links

Junte-se comentando, lendo o que os outros dizem ou colocando um link a partir do seu blog.


Outros Artigos

Strict Standards: Only variables should be assigned by reference in /home/riopro/www/blog.riopro.com.br/wp-includes/post.php on line 117
Criando um quadro-branco digital com um Wiimote

Strict Standards: Only variables should be assigned by reference in /home/riopro/www/blog.riopro.com.br/wp-includes/post.php on line 117
Modelos de negócios diferentes para lucrar na Web

Comente

Tire um tempo para comentar e nos dizer o que você acha. Alguns códigos HTML são permitidos para formatação.

Comentários dos Leitores

Seja o primeiro a comentar!