downloads | documentation | faq | getting help | mailing lists | licenses | wiki | reporting bugs | php.net sites | conferences | my php.net

search for in the

Memcache::addServer> <Memcache
[edit] Last updated: Fri, 17 May 2013

view this page in

Memcache::add

(PECL memcache >= 0.2.0)

Memcache::addAjoute un élément dans le server

Description

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

Memcache::add() stocke la variable var avec la clé key seulement si cette clé n'existe pas déja dans le serveur. La fonction memcache_add() exécute la même action.

Liste de paramètres

key

La clé à associer à l'élément.

var

La variable à stocker. Les chaines et les entiers sont stockés tel quels, les autres types sont sérialisés.

flag

Utilisez MEMCACHE_COMPRESSED pour compresser l'élément (utilise zlib).

expire

Temps d'expiration de l'élément. Si égal à zéro, l'élément n'expirera jamais. Vous pouvez aussi utiliser un timestamp Unix ou un nombre de secondes partant du temps actuel, mais dans ce cas le nombre de secondes ne doit pas exceder 2592000 (30 jours).

Valeurs de retour

Cette fonction retourne TRUE en cas de succès ou FALSE si une erreur survient. Retourne FALSE si la clé existe déja. Pour le reste, le comportement de Memcache::add() est le même que Memcache::set().

Exemples

Exemple #1 Exemple avec 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);

?>

Voir aussi



Memcache::addServer> <Memcache
[edit] Last updated: Fri, 17 May 2013
 
add a note add a note User Contributed Notes Memcache::add - [7 notes]
up
2
matt
3 years ago
It's also good to note that add will succeed if the key exists but is expired
up
1
ktamas77 at gmail dot com
4 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
0
roberto at spadim,com dot br
5 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
0
Davide Renzi
3 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
-1
duerra at nospam dot yahoo dot com
2 years ago
If you're interested in using compression, please note that, at least for PHP version 5.3.2 and Memcache version 3.0.4, when retrieving a key who's value is a numeric or boolean type, PHP throws a notice of the following:

Message: MemcachePool::get(): Failed to uncompress data

The way around this is to test your variable type before setting or adding it to Memcache, or even cast it as a string. 

<?php
$key
= 'mc_key';
$value = 12345;
$compress = is_bool($value) || is_int($value) || is_float($value) ? false : MEMCACHE_COMPRESSED;

$mc= new Memcache;
$mc->connect('localhost', 11211);
$mc->add($key, $value, $compress);

echo
$mc->get($key);

//Alternative is to cast the variable
$value = is_scalar($value) ? (string)$value : $value;
$mc->add($key, $value, MEMCACHE_COMPRESSED);
?>
up
-2
rune(at)intermedia(dot)no
4 years ago
Key may not exceed 250 chars according to memcached protocol.
up
-3
php at tapirpirates dot net
5 years ago
memcache has no locking mechanism, but you could implement it manually.

basic locking through the add method:

<?php
// locks time out after 5 seconds
Define( 'LOCK_TIMEOUT', 5 );

$lock = $memcache->add( 'lock:' . $key, 1, false, LOCK_TIMEOUT );
if (
$lock ) {
 
// no lock on this key, so do what you want
 
$value = $memcache->get( $key );
 
$memcache->set( $key, $value+1 );
 
// release lock
 
$memcache->delete( 'lock:' . $key );
}
else {
 
// variable is currently locked, so do something else
}
?>

furthermore, you could implement a loop which checks if there is a lock, and if there is, wait some time and try again, until the lock is free.

remember: locking will heavily increase your memcache hits and obviously is not what memcache is made for. altough it's not possible for a lock to be forgotten (there's a timeout after all) there is the possibility to get locked out for a very long time.

an alternative may be to implement locking through apc_add (or shared memory), but i've never tried it.

if you absolutley have to implement locks, memcached is probably the wrong solution anyway.

 
show source | credits | stats | sitemap | contact | advertising | mirror sites