ScotlandPHP

Memcached::getMulti

(PECL memcached >= 0.1.0)

Memcached::getMulti複数のアイテムを取得する

説明

public mixed Memcached::getMulti ( array $keys [, array &$cas_tokens [, int $flags ]] )

Memcached::getMulti()Memcached::get() と似ていますが、ひとつのキーのアイテムを取得するのではなく keys 配列で指定したキー群から複数のアイテムを取得します。 cas_tokens 変数を指定した場合は、取得したアイテムの CAS トークンの値をそこに格納します。

注意:

Memcached::get() とは異なり、 Memcached::getMulti() では read-through キャッシュコールバックを指定することができません。 memcache プロトコルでは、複数キーのリクエストでどのキーが見つからなかったのかを知る手段がないからです。

flags パラメータを使用して、 Memcached::getMulti() 用の追加のオプションを設定します。現在使用可能なオプションは Memcached::GET_PRESERVE_ORDER だけで、 これは要求したのと同じ順番でキーが返されることを保障します。

パラメータ

keys

取得したいキーの配列。

cas_tokens

見つかったアイテムの CAS トークンを格納する変数。

flags

取得操作のオプション。

返り値

見つかったアイテムの配列、失敗した場合に FALSE を返します。 必要に応じて Memcached::getResultCode() を使用しましょう。

例1 Memcached::getMulti() の例

<?php
$m 
= new Memcached();
$m->addServer('localhost'11211);

$items = array(
    
'key1' => 'value1',
    
'key2' => 'value2',
    
'key3' => 'value3'
);
$m->setMulti($items);
$result $m->getMulti(array('key1''key3''badkey'), $cas);
var_dump($result$cas);
?>

上の例の出力は、 たとえば以下のようになります。

array(2) {
  ["key1"]=>
  string(6) "value1"
  ["key3"]=>
  string(6) "value3"
}
array(2) {
  ["key1"]=>
  float(2360)
  ["key3"]=>
  float(2362)
}

例2 Memcached::GET_PRESERVE_ORDER の例

<?php
$m 
= new Memcached();
$m->addServer('localhost'11211);

$data = array(
    
'foo' => 'foo-data',
    
'bar' => 'bar-data',
    
'baz' => 'baz-data',
    
'lol' => 'lol-data',
    
'kek' => 'kek-data',
);

$m->setMulti($data3600);

$null null;
$keys array_keys($data);
$keys[] = 'zoo';
$got $m->getMulti($keys$nullMemcached::GET_PRESERVE_ORDER);

foreach (
$got as $k => $v) {
    echo 
"$k $v\n";
}
?>

上の例の出力は、 たとえば以下のようになります。

foo foo-data
bar bar-data
baz baz-data
lol lol-data
kek kek-data
zoo 

参考

add a note add a note

User Contributed Notes 1 note

up
0
gabriel dot maybrun at demandmedia dot com
3 years ago
GOTCHA: Recently I was tasked with moving from PECL memcache to PECL memcached and ran into a major problem -- memcache and memcached serialize data differently, meaning that data written with one library can't necessarily be read with the other library.

For example, If you write an object or an array with memcache, it's interpreted as an integer by memcached.  If you write it with memcached, it's interpreted as a string by memcache.

tl;dr - You can't safely switch between memcache and memcached without a either a cache flush or isolated cache environments.

<?php
$memcache
= new Memcache;
$memcacheD = new Memcached;
$memcache->addServer($host);
$memcacheD->addServers($servers);

$checks = array(
   
123,
   
4542.32,
   
'a string',
   
true,
    array(
123, 'string'),
    (object)array(
'key1' => 'value1'),
);
foreach (
$checks as $i => $value) {
    print
"Checking WRITE with Memcache\n";
   
$key = 'cachetest' . $i;
   
$memcache->set($key, $value);
   
usleep(100);
   
$val = $memcache->get($key);
   
$valD = $memcacheD->get($key);
    if (
$val !== $valD) {
        print
"Not compatible!";
       
var_dump(compact('val', 'valD'));
    }

    print
"Checking WRITE with MemcacheD\n";
   
$key = 'cachetest' . $i;
   
$memcacheD->set($key, $value);
   
usleep(100);
   
$val = $memcache->get($key);
   
$valD = $memcacheD->get($key);
    if (
$val !== $valD) {
        print
"Not compatible!";
       
var_dump(compact('val', 'valD'));
    }
}
To Top