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.
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
.
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(){...} }
São oferecidas várias funções para inserir um item no cache. Cada um com sua particularidade.
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'; }
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'; }
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'; }
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; }
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'; }
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'; }
São oferecidas várias funções para remover um item do cache.
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'; }
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'; }
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
.
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);
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();
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(); }
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(); }