Calypte em Aplicações PHP

Calypte é uma ótima opção de cache para aplicações PHP. Ele é extremamente rápido, trabalha bem com pouca memória, permite o armazenamento de dados na memória secundária e tem suporte transacional. Ele pode ser usado para fazer o cache de páginas, compartilhamento de variáveis globais e manipulação de sessões.

Instalação

Calypte pode ser instalado usando Composer.

Adicione no arquivo composer.json em require "calypte/calypte": "1.0.*".

O arquivo vai ficar parecido com:

{
	"name": "meuprojeto",
	...
	"require": {
	...
	"calypte/calypte": "1.0.*"
	},

	...

}

Depois de atualizado o arquivo de configuração, execute o comando composer install.

Outra forma de adicionar o Calypte ao seu projeto é executando o comando composer require calypte/calypte.

Manipulação de dados

As operações no cache são feitas com o uso da classe CalypteConnection. Ela fica localizada no script Calypte\CalypteConnection e possui as seguintes funções:

class CalypteConnection{

    public function close(){...}
 
    public function isClosed(){...}
 
    public function replace($key, $value, 
    $timeToLive = 0, $timeToIdle = 0){...}
 
    public function replaceValue($key, $oldValue, 
    $newValue, $cmp, $timeToLive = 0, $timeToIdle = 0){...}
 
    public function putIfAbsent($key, $value, $timeToLive = 0, 
    $timeToIdle = 0){...}

    public function put($key, $value, $timeToLive = 0, 
    $timeToIdle = 0){...}
 
    public function set($key, $value, $timeToLive = 0, 
    $timeToIdle = 0){...}
 
    public function get($key, $forUpdate = false){...}
 
    public function remove($key){...}

    public function removeValue($key, $value, $cmp){...}
 
    public function setAutoCommit($value){...}
 
    public function isAutoCommit(){...}
 
    public function commit(){...}
 
    public function rollback(){...}
 
    public function getHost(){...}
 
    public function getPort(){...}
 
}
  • close(): fecha a conexão com o servidor;
  • isClosed(): verifica se a conexão está fechada;
  • replace(): substitui o valor associado à chave somente se ele existir;
  • replaceValue(): substitui o valor associado à chave somente se ele for igual a um determinado valor;
  • putIfAbsent(): associa o valor à chave somente se a chave não estiver associada a um valor;
  • put(): associa o valor à chave;
  • set(): associa o valor à chave somente se a chave não estiver associada a um valor;
  • get(): obtém o valor associado à chave bloqueando ou não seu acesso as demais transações;
  • remove(): remove o valor associado à chave;
  • removeValue(): remove o valor associado à chave somente se ele for igual a um determinado valor;
  • setAutoCommit(): define o modo de confirmação automática;
  • isAutoCommit(): obtém o estado atual do modo de confirmação automática;
  • commit(): confirma todas as operações da transação atual e libera todos os bloqueios detidos por essa conexão;
  • rollback(): desfaz todas as operações da transação atual e libera todos os bloqueios detidos por essa conexão;
  • getHost(): obtém o endereço do servidor;
  • getPort(): obtém a porta do servidor.

Adicionando itens

São oferecidas várias funções para inserir um item no cache. Cada um com sua particularidade.

Função put

A função put associa um valor a uma chave, mesmo que ela exista. Retorna true, se o valor for substituído, ou false, se não existir um valor associado à chave.

$result = $con->put('key', $value);

if($result){
    echo 'replaced';
}
else{
    echo 'stored';
}

Função replace

A função replace substitui o valor associado à chave somente se ele existir. Ele retorna true, se o valor for substituído, ou false, se o valor não for armazenado.

$result = $con->replace('key', $value);

if($result){
    echo 'replaced';
}
else{
    echo 'not stored';
}

Função replaceValue

A função replaceValue substitui o valor associado à chave somente se ele existir e for igual a um determinado valor. Ele retorna true, se o valor for substituído, ou false, se o valor não for armazenado.

$result = $con->replaceValue('key', 
$value,
function($a, $b){
    return strcmp($a,$b) == 0;
});

if($result){
    echo 'replaced';
}
else{
    echo 'not stored';
}

Função putIfAbsent

A função putIfAbsent associa o valor à chave somente se a chave não estiver associada a um valor. Retorna o valor associado à chave ou null, se não existir um valor associado à chave. Esse método tem uma particularidade. Quando existe um valor associado à chave, o mesmo é retornado, mas será lançada uma exceção se ele expirar no momento em que for recuperado.

try{
    $currentValue = $con->putIfAbsent('key', $value);
    if($currentValue == null){
        echo 'stored';
    }
    else{
        echo 'not stored';
    }
}
catch(CacheException $e){
    if(e.getCode() == 1030){
        //o valor atual expirou
    }
    throw e;
}

Função set

A função set associa o valor à chave somente se a chave não estiver associada a um valor. Ele retorna true, se o valor for associado à chave, ou false, se ele for descartado.

$result = $con->set('key', $value);
if(result){
    echo 'stored';
}
else{
    echo 'not stored';
}

Obtendo itens

Função get

Um valor é obtido com o uso da função get. Ele retorna o valor associado à chave ou null, se não existir um valor associado.

$value = $con->get('key');

if($value != null){
    echo 'value exists';
}
else{
    echo 'value not found';
}

Removendo itens

São oferecidas várias funções para remover um item do cache.

Função remove

A função remove apaga o valor associado à chave. Ele retorna true, se o valor for removido, ou false, se ele não existir.

$result = $con->remove('key');

if($result){
    echo 'removed';
}
else{
    echo 'not found';
}

Função removeValue

A função removeValue remove o valor associado à chave somente se ele existir e for igual a um determinado valor. Ele retorna true, se o valor for removido, ou false, se ele não existir ou for diferente do valor informado.

$result = $con->removeValue(
'key',
function($a, $b){
    return strcmp($a,$b) == 0;
});

if($result){
    echo 'removed';
}
else{
    echo 'not found';
}

Iniciando uma transação

Uma transação é iniciada com o uso da função setAutoCommit() com o parâmetro igual a false e finalizada com a função commit(), rollback() ou setAutoCommit() com o parâmetro true.

Função setAutoCommit

A função setAutoCommit() define o modo de confirmação automática. Se o modo de confirmação automática estiver ligado, todas as operações serão tratadas como transações individuais. Caso contrário, as operações serão agrupadas em uma transação que deve ser confirmada com a função commit() ou descartadas com a função rollback. Por padrão, cada nova conexão inicia com o modo de confirmação automática ligada.

//inicia a transação desligando o modo de confirmação automática.
$con->setAutoCommit(false);
...
//confirma todas as operações ligando o modo de confirmação automática.
$con->setAutoCommit(true);

Função commit

A função commit() confirma todas as operações da transação atual e libera todos os bloqueios detidos pela atual sessão.

//inicia a transação.
$con->setAutoCommit(false);
...
//confirma todas as operações.
$con->commit();

Função rollback

A função rollback() desfaz todas as operações da transação atual e libera todos os bloqueios detidos pela atual sessão.

try{
    //inicia a transação.
    $con->setAutoCommit(false);
    ...
    //confirma todas as operações.
    $con->commit();
}
catch(Exception $e){
    //Desfaz todas as operações.
    $con->rollback();
}

Evitando a leitura fantasma e leitura não repetitiva

Para resolver o problema de leitura fantasma e leitura não repetitiva, é oferecida a opção de bloquear um determinado item no momento de sua seleção. A opção é o parâmetro forUpdate da ação get.

No exemplo abaixo, depois que a função get() é executada, o item key fica bloqueado até que a função commit() ou rollback() seja executada.

try{
    //inicia a transação.
    $con->setAutoCommit(false);
    //bloqueia o item key.
    $value = $con->get("key", true);
    if($value != null && strcmp($value,"val") == 0){
        //remove o item key se existir e for igual ao valor 'val'
        $con->remove($key);
    }
    //confirma todas as operações.
    $con->commit();
}
catch(Exception $e){
    //Desfaz todas as operações.
    $con->rollback();
}