(PECL memcached >= 0.1.0)
Memcached::cas — Comparar e intercambiar un ítem
Memcached::cas() realiza una operación "comprobar y establecer",
de forma que el ítem será guardado solamente si ningún otro cliente lo actualizó
desde la última vez que este cliente lo obtuvo. La comprobación se realiza mediante
el parámetro cas_token
, el cual es un valor de 64 bit único
asignado al ítem existente por memcache. Ver la documentación de los métodos
Memcached::get*() para averiguar cómo obtener este
token. Observar que el token está representado como un valor de tipo double debido a
las limitaciones de espacio para valores integer de PHP.
cas_token
El valor único asociado con el ítem existente. Generado por memcache.
key
La claven 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.
Memcached::getResultCode() devolverá
Memcached::RES_DATA_EXISTS
si el ítem que se trata
de guardar ha sido modificado desde la última vez que se obtuvo.
Ejemplo #1 Ejemplo de Memcached::cas()
<?php
$m = new Memcached();
$m->addServer('localhost', 11211);
do {
/* obtener la lista de direcciones IP y sus token */
$ips = $m->get('ip_block', null, $cas);
/* Si la lista no existe aún, crear una y realizar
un añadido atómico que fallará si alguien ya añadió un valor */
if ($m->getResultCode() == Memcached::RES_NOTFOUND) {
$ips = array($_SERVER['REMOTE_ADDR']);
$m->add('ip_block', $ips);
/* en caso contrario, añadir la IP a la lista y guardar vía comparar-e-intercambiar
con el token, que fallará si alguien ya actualizó la lista */
} else {
$ips[] = $_SERVER['REMOTE_ADDR'];
$m->cas($cas, 'ip_block', $ips);
}
} while ($m->getResultCode() != Memcached::RES_SUCCESS);
?>