Recentemente passei o And After da versão 1.7 para a versão 2.0.2 do CodeIgniter (CI), e fiquei feliz com as facilidades do driver de cache na nova versão, recomendo a atualização do framework!
Nas versões anteriores só existia (nativamente) o cache de "output" no CI, isso significa que eu só podia cachear uma "saída" para aquela url (por método de um controller). A performance fica voando, porém isso engessava um pouco o cache, não podia fazer verificações de usuário logado, personalização, executar scripts, etc. Se já existia um cache para determinado controller ele era usado e ponto, não podia contar views, verificar data, exibir informações de acordo com o usuário, etc.
Com o novo driver de cache ficou muito mais fácil, você pode optar entre os seguintes tipos de cache:
- Dummy – Utilizado apenas para não dar erro em ambiente de desenvolvimento, ele não cacheia nada.
- File – Cache de arquivo, fica armazenado em /application/cache
- Memcache – cache de memória utilizando um servidor memcached
- APC – Cache APC do PHP
Utilizando o memcache no CodeIgniter
O memcache é um cache de memória, e precisa de um servidor de cache. O primeiro passo é instalar o memcache.
Com o servidor instalado e configurado, você precisa configurar sua aplicação no CodeIgniter para o uso do cache, vamos lá!
Carregando o Driver de cache
A primeira coisa que você precisa é o Driver de Cache carregado:
$this->load->driver('cache');
Com isso você já pode usar os métodos de cache que o driver suporta.
Salvando um objeto de cache
O driver de cache funciona com chave->valor, para salvar um objeto é simples, o método save é chamado com 3 parâmetros nesta ordem:
- Chave do objeto
- Valor do objeto
- "Time to live", tempo em segundos que o cache deve permanecer salvo.
Para salvar o objeto "site" com valor "O Desenvolvedor" por 2 minutos temos o seguinte:
$this->cache->memcached->save('site', 'O Desenvolvedor', 120);
Recuperando um objeto de cache
O método get retorna o valor do objeto se ele existir e false se não existir o objeto em cache:
$site = $this->cache->get('site');
O retorno "false" permite verificação se um objeto existe, por exemplo:
if($this->cache->get('site')){
//faz alguma coisa pois o cache existe
}else{
//Faz uma consulta no banco e salva ela no cache
$this->cache->memcached->save('site', 'O Desenvolvedor', 120);
}
Apagando um objeto do cache
Função delete, bastante intuitiva, só passa como parâmetro a chave do objeto a ser excluído:
$this->cache->delete('site');
Com essas informações tudo o que você precisa para melhorar a performance da sua aplicação é um pouco de criatividade e testes, testes e testes. No And After fiz diversos testes, optei pelo uso de file cache para os posts.
Em alguns casos de posts com centenas de comentários o ganho de performance foi muito grande, no post de cartão de visita por exemplo a performance de back-end ficou mais de 10 vezes mais rápida para entrega dos objetos. Agora estou trabalhando no cache do O Desenvolvedor e do Eu Compraria! Shop.
A melhoria de performance e redução de gasto com servidor valem qualquer tempo investido no estudo e aplicação do cache!
Sugestões, críticas e melhorias nos comentários! 🙂
Referências
- Se você está com problemas no Driver de Cache (depende da versão do CI que você está usando), é necessário fazer uma correção.
- Cache Driver – CodeIgniter Userguide
- Entenda um pouco melhor o fucnionamento do Memcache (iMasters)