PHP 5.5.15 is released

Memcached::cas

(PECL memcached >= 0.1.0)

Memcached::casComparar e intercambiar un ítem

Descripción

public bool Memcached::cas ( float $cas_token , string $key , mixed $value [, int $expiration ] )

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.

Parámetros

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.

Valores devueltos

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.

Ejemplos

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);

?>

Ver también

add a note add a note

User Contributed Notes 1 note

up
0
abodera at gmail dot com
4 years ago
Watch out!

When using binary protocol, the expected result after cas() is 21 (Memcached::RES_END).

For example, to make the above example #1 work with binary protocol, use the following:
<?php
$m
= new Memcached();
$m->addServer('localhost', 11211);
$m->setOption(Memcached::OPT_BINARY_PROTOCOL,true)

// [...]

   
} else {
       
$ips[] = $_SERVER['REMOTE_ADDR'];
       
$m->cas($cas, 'ip_block', $ips);
    }  
} while (
$m->getResultCode() != Memcached::RES_END);
?>
To Top