(PECL memcached >= 0.1.0)
Memcached::cas — Compara e troca um item
$cas_token
,$key
,$value
,$expiration
= 0
Memcached::cas() realiza uma operação de "check and set",
de forma que o item será armazenado apenas se nenhum outro cliente o tiver
atualizado desde a última vez que foi buscado por este cliente. A verificação é
feita por meio do parâmetro
cas_token
, que é um valor exclusivo de 64 bits atribuído
ao item existente pelo memcache. Consulte a documentação dos métodos
Memcached::get*() para saber como obter esse
token. Observe que o token é representado como um float devido às limitações do espaço inteiro do PHP.
cas_token
Valor exclusivo associado ao item existente. Gerado por memcache.
key
A chave sob a qual armazenar o valor.
value
O valor a ser armazenado.
expiration
O tempo de expiração padrão é 0. Consulte Tempos de Expiração para mais informações.
Retorna true
em caso de sucesso ou false
em caso de falha.
O Memcached::getResultCode() retornará
Memcached::RES_DATA_EXISTS
se o item que você
está tentando armazenar tiver sido modificado desde a última vez que você o buscou.
Exemplo #1 Exemplo de Memcached::cas()
<?php
$m = new Memcached();
$m->addServer('localhost', 11211);
do {
/* busca lista de IP e seu token */
$ips = $m->get('ip_block', null, $cas);
/* se a lista ainda não existir, crie-a e faça
uma adição atômica que falhará se alguém já tiver adicionado i */
if ($m->getResultCode() == Memcached::RES_NOTFOUND) {
$ips = array($_SERVER['REMOTE_ADDR']);
$m->add('ip_block', $ips);
/* caso contrário, adicione o IP à lista e armazene via comparação e troca
com o token, que falhará se outra pessoa atualizar a lista */
} else {
$ips[] = $_SERVER['REMOTE_ADDR'];
$m->cas($cas, 'ip_block', $ips);
}
} while ($m->getResultCode() != Memcached::RES_SUCCESS);
?>