International PHP Conference Berlin 2025

Memcache::add

(PECL memcache >= 0.2.0)

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

Description

Memcache::add(
    string $key,
    mixed $var,
    int $flag = ?,
    int $expire = ?
): bool

Memcache::add() stocke la variable var avec la clé key seulement si cette clé n'existe pas déjà 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éjà. 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', false, 30);

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

?>

Voir aussi

add a note

User Contributed Notes 5 notes

up
8
vasiliy at hotger dot com
10 years 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
4
Davide Renzi
14 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
3
ktamas77 at gmail dot com
15 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
matt
15 years ago
It's also good to note that add will succeed if the key exists but is expired
up
-2
roberto at spadim,com dot br
17 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
To Top