PHP Conference Japan 2024

Memcache::get

(PECL memcache >= 0.2.0)

Memcache::get從伺服器擷取項目

說明

Memcache::get(字串 $key, 整數 &$flags = ?): 字串
Memcache::get(陣列 $keys, 陣列 &$flags = ?): 陣列

如果伺服器此時存在此類 keyMemcache::get() 會返回先前儲存的項目資料。

您可以將鍵的陣列傳遞給 Memcache::get() 以取得值的陣列。結果陣列將僅包含找到的鍵值對。

參數

key

要擷取的鍵或鍵的陣列。

旗標

如果存在,與值一起擷取的旗標將會寫入此參數。這些旗標與例如 Memcache::set() 所提供的旗標相同。整數的最低位元組保留供 pecl/memcache 內部使用(例如,指示壓縮和序列化狀態)。

返回值

返回與 key 相關聯的值,或當 key陣列 時,返回找到的鍵值對的陣列。如果失敗、找不到 keykey 為空 陣列,則返回 false

範例

範例 #1 Memcache::get() 範例

<?php

/* 程序式 API */
$memcache_obj = memcache_connect('memcache_host', 11211);
$var = memcache_get($memcache_obj, 'some_key');

/* 物件導向 API */
$memcache_obj = new Memcache;
$memcache_obj->connect('memcache_host', 11211);
$var = $memcache_obj->get('some_key');

/*
您也可以使用鍵的陣列作為參數。
如果在伺服器上找不到此類項目,結果
陣列將不會包含此類鍵。
*/

/* 程序式 API */
$memcache_obj = memcache_connect('memcache_host', 11211);
$var = memcache_get($memcache_obj, array('some_key', 'another_key'));

/* 物件導向 API */
$memcache_obj = new Memcache;
$memcache_obj->connect('memcache_host', 11211);
$var = $memcache_obj->get(array('some_key', 'second_key'));

?>

新增筆記

使用者貢獻的筆記 7 則筆記

clover at fromru dot com
11 年前
如果伺服器上找不到 $key,$flags 將保持不變,這有助於判斷是否儲存了 bool(false)

<?php

$memcache
= new Memcache();

$memcache->set('test', false); //
$flags = false;
var_dump($memcache->get('test', $flags)); // bool(false)
var_dump($flags); // int(256) - 已變更為 int

$memcache->delete('test');

$flags = false;
var_dump($memcache->get('test', $flags)); // bool(false)
var_dump($flags); // bool(false) - 保持不變

?>
Michael Brenden
13 年前
注意,如果鍵名中存在反斜線,則結果將不可預測且隨機。

我像這樣產生鍵值

$mc_key = get_called_class(). $_COOKIE['crumb'];

當 get_called_class() 返回 CLASSNAME 時,這可以正常運作。

但後來我開始使用命名空間,get_called_class() 當然會返回 NAMESPACE\CLASSNAME

這個反斜線會讓 Memcache 陷入混亂。
請注意,沒有錯誤訊息,只是結果不正常。
bijay dot rungta at gmail dot com
11 年前
請注意,如果您在儲存資料時在鍵值中包含空格,並使用鍵值陣列來取得資料,則返回的陣列會將鍵值中的空格替換為底線。

<?php

$memcache
= new Memcache;
$memcache->connect('localhost');
$memcache->set('my-key', 'value1', 0, 300);
$memcache->set('key with space', 'value 2', 0, 300);

print_r($memcache->get(array('my-key', 'key with space'))); // Array ( [my-key] => value1 [key_with_space] => value 2 )

?>

Memcache 在儲存時會將空格取代為底線,在讀取時也會這樣做,但當您使用單一鍵值(字串)讀取時,您不會注意到這一點,因為它只會傳回值。但是,當您使用鍵值陣列進行讀取時,您會預期傳回的陣列中會有相同的鍵值,但它會將其中的空格取代為底線。
csongor at halmai dot hu
10 年前
避免從 memcache 讀取過多的值。每次 get() 都會消耗一些記憶體。您應該將讀取的值快取起來,而不是每次都讀取。不良做法的範例:

<?php // 從 memcache 讀取會造成記憶體洩漏

$m = new Memcache();
$m -> connect( "localhost", "11211" );
$m -> add("foo", "bar");

for(;;) {
// 這個「無盡」迴圈會結束,因為它會耗盡所有記憶體
$res = $m -> get("foo");
print
memory_get_usage()."\n"; // 這會寫出越來越大的數字
}
jakub dot lopuszanski at nasza-klasa dot pl
16 年前
如果因為某些原因反序列化失敗,也就是 memcache 伺服器傳回的旗標設為 1,但該值並非正確序列化的 PHP 資料時,
Memcache::get 的行為方式如下:

如果它是以單一鍵值進行擷取,則會產生警告,但由於它實際上不是伺服器的錯誤,因此警告會顯示一些令人困惑的訊息,例如「Memcached 伺服器錯誤:null」,且函式會傳回 bool(false)。

如果它是透過傳遞陣列(即使陣列中只有一個元素)來呼叫,則不會產生警告,且產生的陣列會包含值 bool(false)。

由於 Memcached 伺服器中存在一些緩衝區溢位錯誤,這些錯誤有時會導致[部分]資料被覆蓋,因此無法反序列化,請務必檢查 Memcache::get 的結果是否只包含字串或反序列化的結構。如果結果是 bool、double 或 long,則表示發生錯誤。
a dot karabiowski at gmx dot net
10 年前
簽章不正確。

<?php
$memcache
= new Memcache();
$memcache->connect('localhost', 11211);
class
Test { public $property = "testvalue"; }
$test = new Test();
$memcache->set("asdf", $test);
var_dump($memcache->get("asdf"));
/* 會傳回物件,而不是字串:
class Test#3 (1) {
public $property =>
string(9) "testvalue"
}
*/
?>
nate
16 年前
請注意,當使用多鍵版本時,如果沒有為池組態任何伺服器(並且可能在嘗試擷取時發生其他錯誤),Memcache::get 會傳回布林值 false。此外,如果您沒有向池中添加任何伺服器,Memcache 類別會在每次 get/set/delete 類型的呼叫中拋出惱人的警告。

以下程式碼片段 var_dump 的布林值為 false,而不是您可能預期的空陣列。

<?php
$cache
= new Memcache;

// 沒有 $cache->addServer 呼叫(例如,
由於暫時停用快取的使用)

// 使用 @ 符號忽略警告

var_dump(
@
$cache->get(array('one', 'two'))
);
?>
To Top