(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_token
Valor único asociado a un elemento existente. Generado por memcached.
key
La clave en la que se guardará el valor.
value
El valor a guardar.
expiration
Tiempo de expiración, que por defecto es 0. Ver Tiempos de expiración para más información.
Devuelve true
en caso de éxito o false
en caso de 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);
?>