Usando Fragments no Kohana

Fragments é um recurso muito bacana que está disponível no framework Kohana desde a versão 3.0, que permite de forma simples e rápida fazer cache de alguma view ou trecho HTML.

Basicamente você pode usar Fragments quando o tempo de leitura do fragmento for menor do que o tempo de geração do mesmo contéudo. Isso pode ser muito útil naqueles casos onde você tem um menu ou parte do seu layout que pode ser processada uma única vez e sempre ser carregada de um cache em vez de ser processada a view a cada requisição.

Como usar

Vamos usar o exemplo do menu:

// Cache do fragmento por 10 minutos
if (!Fragment::load('viewMenu', Date::MINUTE * 10))
{
	// Tudo até a chamada Fragment::save() será gravado como fragmento
	echo html::anchor('inicio','Início');
	echo html::anchor('kohana','Kohana');
	echo html::anchor('plugins','Plugins');
	echo html::anchor('contato','Contato');

	// Salva o fragmento em cache
	Fragment::save();
}

O código já comentado fica bem mais fácil do que explicar :)
Simplificando, funciona da seguinte forma:

  1. Fragment::load() tenta carregar o fragmento do cache
  2. Se não encontrar retornará false, e ficará aguardando o trecho a ser guardado neste fragmento até a chamada Fragment::save()
  3. O padrão de armazenamento de cada fragmento é 30 segundos, mas você pode especificar um timeout na chamada Fragment::load()
  4. Você pode forçar um fragmento ser excluído usando Fragment::delete() ou usando timeout como zero
Kohana Fragments, exemplo de uso

Sem inspiração pra uma imagem, postei o código de exemplo :)

Não é interessante usar Fragments para guardar variáveis, objetos ou ainda resultados de banco de dados. Para objetos mais complexos o módulo Cache é muito mais robusto e eficiente.

É simples, é Kohana!
É por isso que eu gosto :)

Usando Memcache com Kohana PHP

O Memcache é um sistema de cache de memória distribuída de alta performance, que permite acesso rápido a objetos que são armazenados em seu cache. A utilização vai da criatividade e necessidade do programador, que pode armazenar resultados de consultas, imagens, objetos, códigos para rápido acesso posterior.

Servers
Creative Commons License photo credit: JohnSeb

O uso de Memcache normalmente segue um padrão:

  1. O aplicativo recebe uma consulta do usuário ou do aplicativo.
  2. O aplicativo verifica se os dados necessários para satisfazer a consulta estão no cache de memória.
  3. Se os dados estiverem no cache de memória, o aplicativo utiliza os dados.
  4. Se os dados não estiverem no cache de memória, o aplicativo consulta o armazenamento de dados e armazena os resultados no cache de memória para solicitações futuras.

Legal, e no Kohana?

Primeiro passo, vamos copiar o arquivo /system/config/cache.php para /application/config/cache.php
Configure o arquivo para que fique desta forma:

$config['default'] = array(
  'driver'   => 'memcache',
  'params'   => '',
  'lifetime' => 3600,
  'requests' => 1000
);

Você pode alterar os parâmetros como precisa, onde sugiro:

lifetime = 3600 segundos (1h de timeout)
requests = 1000 (mil requisições de timeout)

E se o MemCache estiver em outro servidor?

Ai está, uma dica importante! Se você não executa o MemCache no mesmo servidor do Kohana, você precisa alterar o arquivo cache_memcache.php  em application/config. Se você tiver mais de um servidor memcached, você pode adicioná-las ao array $config['servers']. Veja um exemplo:

$config['servers'] = array(
  array(
    'host' => '127.0.0.1',
    'port' => 1234,
    'persistent' => FALSE
  )
);

Exemplos

Pronto as configurações, agora é a hora tão esperada em usar o cache, e realmente é a etapa mais fácil:

// Instancia o cache
$cache = Cache::instance();

// Tentando obter dados do cache
$retorno = $cache->get('item');

if(!$retorno)
{
  // Dados não retornaram, obtendo dados da origem
  $retorno = ORM::Factory('teste')->dados();

  // Gravando novo cache
  $cache->set('item',$retorno);
}

Simples, não? É Kohana e é por isso que eu gosto!