Memcached::getMulti
(PECL memcached >= 0.1.0)
Memcached::getMulti — 複数のアイテムを取得する
説明
Memcached::getMulti() は
Memcached::get() と似ていますが、ひとつのキーのアイテムを取得するのではなく
keys
配列で指定したキー群から複数のアイテムを取得します。
注意:
v3.0 より前のバージョンでは、二番目のパラメータ
&cas_tokens
が存在して、見つかったアイテムの CAS トークンが書き込まれるようになっていました。 この&cas_tokens
パラメータは memcached 拡張モジュールの v3.0 で削除されました。 その代わりに追加されたのがMemcached::GET_EXTENDED
フラグで、 これをget_flags
に指定すれば CAS トークンを得られます。
get_flags
パラメータを使用して、
Memcached::getMulti()
用の追加のオプションを設定します。
Memcached::GET_PRESERVE_ORDER
は、要求したのと同じ順番でキーが返されることを保証します。
Memcached::GET_EXTENDED
は、CAS トークンも含めて返すようにします。
パラメータ
keys
-
取得したいキーの配列。
get_flags
-
取得操作のオプション。
戻り値
見つかったアイテムの配列、失敗した場合に false
を返します。
必要に応じて Memcached::getResultCode() を使用しましょう。
変更履歴
バージョン | 説明 |
---|---|
PECL memcached 3.0.0 |
&cas_tokens パラメータが削除されました。
Memcached::GET_EXTENDED が追加され、これをフラグとして渡すと CAS トークンも取得するようになりました。
|
例
例1 Memcached::getMulti() example for Memcached v3
<?php
// Valid for v3 of the extension
$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'));
var_dump($result);
?>
上の例の出力は、 たとえば以下のようになります。
array(2) { ["key1"]=> string(6) "value1" ["key3"]=> string(6) "value3" }
例2 Memcached::getMulti() example for Memcached v1 and v2
<?php
// Valid for v1 and v2 of the extension
$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) }
例3 Memcached v3 用の Memcached::GET_PRESERVE_ORDER
の例
<?php
// Valid for v3 of the extension
$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($data, 3600);
$keys = array_keys($data);
$keys[] = 'zoo';
$got = $m->getMulti($keys, Memcached::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
例4 Memcached v1 および v2 用の Memcached::GET_PRESERVE_ORDER
の例
<?php
// Valid for v1 and v2 of the extension
$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($data, 3600);
$null = null;
$keys = array_keys($data);
$keys[] = 'zoo';
$got = $m->getMulti($keys, $null, Memcached::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
参考
- Memcached::getMultiByKey() - 指定したサーバーから複数のアイテムを取得する
- Memcached::get() - アイテムを取得する
- Memcached::getDelayed() - 複数のアイテムを要求する
User Contributed Notes 1 note
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'));
}
}