PHP Australia Conference 2015

Memcache::add

(PECL memcache >= 0.2.0)

Memcache::addAñadir un valor en el servidor

Descripción

bool Memcache::add ( string $key , mixed $var [, int $flag [, int $expire ]] )

Memcache::add() guarda la variable var con la clave key solamente si la clave no existe todavía en el servidor. También se puede usar la función memcache_add().

Parámetros

key

La clave que quedará asociada con el valor.

var

La variable a guardar. Cadenas y enteros se guardan tal y como son, otros tipos se guardan serializados.

flag

Use MEMCACHE_COMPRESSED para guardar datos comprimidos (usa zlib).

expire

Tiempo de expiración del valor. Si es iqual a cero, el valor nunca expirará. También puedes usar Unix timestamp o el número de segundos empezando desde la fecha actual, el valor no puede exceder de 2592000 segundos (30 días).

Valores devueltos

Devuelve TRUE en caso de éxito o FALSE en caso de error. Devuelve FALSE si la clave ya existe. Por el resto Memcache::add() se comporta similar a Memcache::set().

Ejemplos

Ejemplo #1 Ejemplo Memcache::add()

<?php

$memcache_obj 
memcache_connect("localhost"11211);

/* procedural API */
memcache_add($memcache_obj'var_key''test variable'false30);

/* OO API */
$memcache_obj->add('var_key''test variable'false30);

?>

Ver también

add a note add a note

User Contributed Notes 5 notes

up
6
ktamas77 at gmail dot com
5 years ago
skeleton of a thread safe updater for an incremental counter:

<?php

$key
= "counter";
$value = $memcache->increment($key, 1);
if (
$value === false) {
  
// --- read from DB ---
  
$query = "SELECT value FROM database";
  
$result = mysql_query($query);
  
$row = mysql_fetch_assoc($result);
  
$db_value = $row["value"];
  
$add_value = $memcache->add($key, $db_value + 1, 0, 0);
   if (
$add_value === false) {
     
$value = $memcache->increment($key, 1)
      if (
$value === false) {
         
error_log ("counter update failed.");
      }
   } else {
     
$value = $db_value + 1;
   }
}

// --- display counter value ---
echo $value;

?>
up
2
Davide Renzi
4 years ago
Race conditions happen on an heavy load server when more than one thread tries to execute memcache_add.
For example if thread A and thread B try to save the same key you can test that sometimes both return TRUE.
To have the right behaviour you can verify that the correct value is in the assigned key:

<?php
function memcache_safeadd(&$memcache_obj, $key, $value, $flag, $expire)
{
    if (
memcache_add($memcache_obj, $key, $value, $flag, $expire))
    {
        return (
$value == memcache_get($memcache_obj, $key));
    }
    return
FALSE;
}
?>
up
0
roberto at spadim,com dot br
7 years ago
[c.2007]
if you read source code for MMC_SERIALIZED you will see at line ~1555 that [a line ~1560]
!(is_string,is_long,is_double,is_bool)

[is] serialized and that serialized values are flaged as MMC_SERIALIZED for return (fetch) code unserialize these values again
up
-2
vasiliy at hotger dot com
7 months ago
It looks like add() function is truly 100% atomic, and safeadd bicycle mentioned in the other comment is useless. There are few links where developers of Memcahed explained it deeper

http://lists.danga.com/pipermail/memcached/2008-March/006647.html
http://www.serverphorums.com/read.php?9,214222
up
-2
matt
5 years ago
It's also good to note that add will succeed if the key exists but is expired
To Top