(PECL memcached >= 0.1.0)
Memcached::cas — Comparar y cambiar un elemento
$cas_token,$key,$value,$expiration = 0
Memcached::cas() realiza una operación de
"check and set" (literalmente, verificar y asignar),
de manera que el elemento solo se almacena si ningún otro cliente
lo ha actualizado desde que fue leído por el cliente actual. La verificación
se realiza mediante el argumento cas_token que es un
valor único de 64 bits, asignado al elemento por memcached. Consulte la documentación
de Memcached::get*() para saber cómo obtener este valor. Tenga en cuenta que este valor se representa como un número flotante, debido a limitaciones en el espacio de enteros de PHP.
cas_tokenValor único asociado a un elemento existente. Generado por memcached.
keyThe key under which to store the value.
valueThe value to store.
expirationThe expiration time, defaults to 0. See Expiration Times for more info.
Esta función retorna true en caso de éxito o false si ocurre un error.
El método Memcached::getResultCode() va devolver
la constante Memcached::RES_DATA_EXISTS si el elemento que
se intenta almacenar ha sido modificado desde la última lectura.
Ejemplo #1 Ejemplo con Memcached::cas()
<?php
$m = new Memcached();
$m->addServer('localhost', 11211);
do {
/* Lee una IP y su CAS */
$ips = $m->get('ip_block', null, $cas);
/* Si la IP no existe aún, se crea y se realiza
un añadido atómico que fallará si la IP ya ha sido añadida */
if ($m->getResultCode() == Memcached::RES_NOTFOUND) {
$ips = array($_SERVER['REMOTE_ADDR']);
$m->add('ip_block', $ips);
/* De lo contrario, se añade la IP a la lista, y se almacena con la operación
compare-and-swap y el token, que fallará si la lista ha sido actualizada */
} else {
$ips[] = $_SERVER['REMOTE_ADDR'];
$m->cas($cas, 'ip_block', $ips);
}
} while ($m->getResultCode() != Memcached::RES_SUCCESS);
?>