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

search for in the

Memcache::addServer> <Memcache
[edit] Last updated: Fri, 10 Feb 2012

view this page in

Memcache::add

(PECL memcache >= 0.2.0)

Memcache::addサーバに項目を追加する

説明

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

Memcache::add() は、サーバに同名のキーが存在しない 場合に限り、key というキーで 値 var を格納します。 memcache_add() 関数を使用することも可能です。

パラメータ

key

項目に関連付けられたキー。

var

格納する値。文字列および整数値はそのままの形式で、それ以外の型は シリアライズされて格納されます。

flag

項目を圧縮して格納する場合に MEMCACHE_COMPRESSED を使用します (zlib を使用します)。

expire

項目の有効期限。ゼロの場合は有効期限なし (いつまでも有効) となります。Unix タイムスタンプ形式、あるいは現在からの 秒数で指定することが可能ですが、後者の場合は秒数が 2592000 (30 日) を超えることはできません。

返り値

成功した場合に TRUE を、失敗した場合に FALSE を返します。 もし同名のキーが既に存在する場合は FALSE を返します。 それ以外は、Memcache::add() の振る舞いは Memcache::set() と同じです。

例1 Memcache::add() の例

<?php

$memcache_obj 
memcache_connect("localhost"11211);

/* 手続き型の API */
memcache_add($memcache_obj'var_key''test variable'false30);

/* オブジェクト指向の API */
$memcache_obj->add('var_key''test variable'false30);

?>

参考



Memcache::addServer> <Memcache
[edit] Last updated: Fri, 10 Feb 2012
 
add a note add a note User Contributed Notes Memcache::add
duerra at nospam dot yahoo dot com 18-Nov-2010 01:06
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);
?>
Davide Renzi 18-Feb-2010 10:16
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;
}
?>
matt 04-Aug-2009 03:39
It's also good to note that add will succeed if the key exists but is expired
ktamas77 at gmail dot com 27-Apr-2009 01:08
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;

?>
rune(at)intermedia(dot)no 06-Oct-2008 08:04
Key may not exceed 250 chars according to memcached protocol.
php at tapirpirates dot net 03-Apr-2008 05:32
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.
roberto at spadim,com dot br 18-Jun-2007 07:13
[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

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