PHP 7.2.0 Release Candidate 4 Released

Memcache::add

(PECL memcache >= 0.2.0)

Memcache::addДобавляет элемент с указанным ключем

Описание

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

Memcache::add() записывает элемент var с указанным ключем key только если указанный ключ еще не существует на сервере. Так же вы можете использовать функцию memcache_add().

Список параметров

key

Ключ с которым будет ассоциирован элемент.

var

Переменная для сохранения. Строковые и числовые значения сохраняются как есть, а остальные типы сериализируются.

flag

Используйте MEMCACHE_COMPRESSED для записи элемента со сжатием (используется zlib).

expire

Время жизни элемента. Если равно нулю, элемент никогда не устаревает. Так же вы можете использовать Unix timestamp или число секунд начиная с текущего момента, однако, число секунд не может быть больше 2592000 (30 дней).

Возвращаемые значения

Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки. Возвращает FALSE если такой ключ уже существует. В остальных случаях поведение Memcache::add() аналогично Memcache::set().

Примеры

Пример #1 Memcache::add() пример

<?php

$memcache_obj 
memcache_connect("localhost"11211);

/* процедурный стиль */
memcache_add($memcache_obj'var_key''test variable'false30);

/* объектный стиль */
$memcache_obj->add('var_key''test variable'false30);

?>

Смотрите также

add a note add a note

User Contributed Notes 5 notes

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