0 follower

Data Caching (Caching de Dados)

O caching de dados consiste em armazenar e recuperar variáveis PHP no cache. Para essa finalidade, a classe base CCache fornece dois métodos que são utilizados na maioria dos casos: set() e get().

Para armazenar a variável $value em cache, escolhemos um ID único e utilizamos o método set() para armazena-lo:

Yii::app()->cache->set($id, $value);

O dado armazenado ficará em cache para sempre, a não ser que ele seja eliminado por alguma regra de caching (por exemplo, o espaço para caching esteja cheio e, então, os dados mais velhos são removidos). Para alterar esse comportamento, ao executar o método set(), podemos especificar também um parâmetro de tempo de expiração, de forma a indicar que o dado deve ser removido do cache depois de um certo período de tempo.

// Mantém o valor no cache por 30 segundos
Yii::app()->cache->set($id, $value, 30);

Mais tarde, quando precisarmos acessar essa variável (nessa requisição, ou em outras) utilizamos o método get() informando o ID da variável desejada. Se o valor retornado for false, significa que a variável não está disponível no cache, e devemos armazena-la novamente.

$value=Yii::app()->cache->get($id);
if($value===false)
{
    // re-armazena $value porque seu valor não foi encontrado
    // Yii::app()->cache->set($id,$value);
}

Ao escolher o ID para variável a ser armazenada, tenha certeza de que ele seja único entre todos os outros utilizados pelas demais variáveis em cache na aplicação. NÃO é necessário que o ID seja único entre aplicações diferentes, uma vez que o componente de cache é inteligente o suficiente para diferenciar IDs de aplicações diferentes.

Alguns sistemas de cache, tais como MemCache e APC, suportam a recuperação em lote de vários valores em cache, podendo reduzir a sobrecarga involvida nesse processo. A partir da versão 1.0.8, um novo método chamado mget() explora essa funcionalidade. Caso o sistema de cache utilizado não suporte este recurso, o método mget() irá simula-lo.

Para remover uma variável do cache, utilizamos o método delete(). Para remover tudo do cache, utilizamos o método flush(). Tenha muito cuidado ao utilizar o método flush() porque ele também irá remover dados de outras aplicações.

Dica: Como a classe CCache implementa ArrayAccess, um componente de cache pode ser utilizado como um vetor. Abaixo, alguns exemplos:

$cache=Yii::app()->cache;
$cache['var1']=$value1;  // equivalente a: $cache->set('var1',$value1);
$value2=$cache['var2'];  // equivalente a: $value2=$cache->get('var2');

1. Dependências do Cache

Além do tempo de expiração, os dados em cache podem ser invalidados de acordo com a alteração de algumas dependências. Por exemplo, se estamos fazendo cache do conteúdo de uma arquivo e ele é alterado, devemos invalidar o cópia em cache e recuperar o conteúdo atualizado diretamente do arquivo, em vez do cache.

Representamos uma dependência como uma instância de CCacheDependency, ou uma de suas classes derivadas. Passamos essa instância, juntamente com os dados que devem ser armazenados, para o método set().

// value irá expirar em 30 segundos
// ela também deverá se tornar inválida se o conteúdo de 'FileName' for alterado
Yii::app()->cache->set($id, $value, 30, new CFileCacheDependency('FileName'));

Agora, ao recuperar a variável $value do cache, com o método get(), a dependência será verificada e, se o arquivo foi alterado, retornará um false, indicando que a informação precisa ser re-armazenada.

Abaixo temos um resumo com todas as dependências do cache:

  • CFileCacheDependency: a dependência é alterada caso a hora de última modificação do arquivo tenha sido alterada.

  • CDirectoryCacheDependency: a dependência é alterada se qualquer um dos arquivos ou subdiretórios do diretório informado sofrer alterações.

  • CDbCacheDependency: a dependência é alterada se o resultado da consulta informada sofre alterações.

  • CGlobalStateCacheDependency: a dependência é alterada se o valor do estado global informado for alterado. Um estado global é uma variável que é persistente entre múltiplas requisições e sessões de uma aplicação. Ele é definido através do método CApplication::setGlobalState().

  • CChainedCacheDependency: a dependência é alterada se qualquer uma das dependências na cadeia informada sofrer alteração.

  • CExpressionDependency: a dependência é alterada se o resultado da expressão PHP informada for alterado. Essa classe está disponível a partir da versão 1.0.4.