2024 年 PHP Conference Japan

Memcached::__construct

(PECL memcached >= 0.1.0)

Memcached::__construct建立 Memcached 實例

說明

公開 Memcached::__construct(?字串 $persistent_id = null, ?可呼叫 $callback = null, ?字串 $connection_str = null)

建立一個表示與 memcache 伺服器連線的 Memcached 實例。

警告

此函式目前沒有文件說明;僅提供其參數列表。

參數

persistent_id

預設情況下,Memcached 實例會在請求結束時銷毀。要建立一個在請求之間持續存在的實例,請使用 persistent_id 指定實例的唯一 ID。所有使用相同 persistent_id 建立的實例將共享相同的連線。

callback

connection_str

範例

範例 #1 建立一個 Memcached 物件

<?php
/* 建立一個一般實例 */
$m = new Memcached();
echo
get_class($m);

/* 建立一個持續性實例 */
$m2 = new Memcached('story_pool');
$m3 = new Memcached('story_pool');

/* 現在 $m2 和 $m3 共享相同的連線 */
?>

新增註解

使用者貢獻的註解 7 則註解

tschundler at gmail dot com
15 年前
使用持續性連線時,重要的是不要重複新增伺服器。

這是您不應該做的
<?php
$mc
= new Memcached('mc');
$mc->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE, true);
$mc->addServers(array(
array(
'mc1.example.com',11211),
array(
'mc2.example.com',11211),
));
?>每次載入頁面時,這些伺服器都會被附加到列表中,導致同時存在許多到同一個伺服器的開啟連線。 addServer/addServers 函式不會檢查是否存在對指定伺服器的引用。

更好的方法類似於:
<?php
$mc
= new Memcached('mc');
$mc->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE, true);
if (!
count($mc->getServerList())) {
$mc->addServers(array(
array(
'mc1.example.com',11211),
array(
'mc2.example.com',11211),
));
}
?>
clancy hood at gmail dot com
13 年前
如果您想在一個相對較小的專案上開始使用 Memcached,但需要一定的可擴展性,那麼允許 $persistent_id 也表示一個鍵值前綴和一個您自己定義的伺服器集是有意義的。這使得在整個專案生命週期中,鍵值分離和將資料集分配給特定伺服器變得非常簡單,而不會妨礙您的任何選項。

<?php

// Here is the array which we will add to in the future
$GLOBALS['memcached-sets'] = array (
'_' => array (
array(
'localhost', 11211)
)
);

define('DEFAULT_MEMCACHED_SET', '_');

function
mcache( $persistent_id=DEFAULT_MEMCACHED_SET ) {

// one instantiation per-connection per-request
static $memcached_instances = array();

if(
array_key_exists($persistent_id, $memcached_instances)) {
$instance = $memcached_instances[$persistent_id];
}else{
$instance = new Memcached($persistent_id);
$instance->setOption(Memcached::OPT_PREFIX_KEY, $persistent_id);
$instance->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE, true); // advisable option

// Add servers if no connections listed. Get server set by $persistent_id or use default set.
// In a production environment with multiple server sets you may wish to prevent typos from silently adding data
// to the default pool, in which case return an error on no match instead of defaulting
if( !count($instance->getServerList()) ) {
$servers = array_key_exists($persistent_id, $GLOBALS['memcached-sets'])
?
$GLOBALS['memcached-sets'][$persistent_id]
:
$GLOBALS['memcached-sets'][DEFAULT_MEMCACHED_SET];
$instance->addServers($servers);
}

$memcached_instances[$persistent_id] = $instance;
}
return
$instance;
}

// simple example
mcache()->set('foo', 'bar');
mcache('myset')->set('foo', 'baz');

var_dump(mcache()->get('foo'), mcache('myset')->get('foo'));

?>

字串(3) "bar"
字串(3) "baz"

請記住,保持您的 $persistent_ids 簡短,因為它們會影響您的最大鍵值長度。祝您編碼愉快! :)
enknamel AT gmail DOT com
12 年前
因為我聽從了這裡的評論,這讓我抓狂。

如果您啟用持久性,您設定的選項也會持續存在,而且如果您在啟用持久性的情況下設定某些選項,將會關閉所有持久性連線。這是 memcached 擴充套件所基於的 libmemcached 的一部分。您可以透過執行 strace 來驗證這一點。

所以您應該這樣做

<?php

$mem
= new Memcached($myPoolId);

if(empty(
$mem->getServerList())) {
//這段程式碼只會在設定新的 EG(persistent_list) 項目時執行
$mem->setOption(Memcached::OPT_RECV_TIMEOUT, 1000);
$mem->setOption(Memcached::OPT_SEND_TIMEOUT, 3000);
$mem->setOption(Memcached::OPT_TCP_NODELAY, true);
$mem->setOption(Memcached::OPT_PREFIX_KEY, "md_");
$mem->addServer($myMemcahceIp, $myMemcachePort);
}

?>
Tobias
13 年前
請注意,使用這個 Memcached 介面時,如果一個或多個底層的 memcached 伺服器關閉、網路延遲很高(預設超過 1 秒)或已崩潰,則仍然不會有任何警告、錯誤或通知。一切看起來都會正常運作,只是你不會得到正確的結果。
Tobias
13 年前
我不確定,但似乎 __construct() 建立了一個 Memcache() 類別的實例,該實例至少存在於子 Apache 處理程序中,甚至可能存在於主要的 Apache 處理程序中。

這(似乎)意味著添加到伺服器「池」(透過 ->addServers() )的 Memcache 伺服器會被記住。

這就是為什麼你不希望每次執行腳本時都呼叫 ->addServers() 的原因,因為 ->addServers() 不會檢查重複項,並且會從 Apache 處理程序向 memcached 伺服器程序添加數百或數千個連線。

一個副作用是任何其他腳本(即使跨不同的網站網域)也可以添加到你的伺服器「池」(如果他們知道伺服器池名稱,或者他們可以從 memcached 伺服器本身獲取它(不確定這是否/如何可行),或者你和你的團隊已經使用相同的伺服器池編寫了多個網站(例如, new Memcached( 'same-server-pool-name' ))。這可能會造成安全漏洞。
jeroen at 4worx dot com
15 年前
將多個 memcached 實例與選項結合使用持續性連線可能會造成混淆。

<?php

$a
= new Memcached('memcached_pool');
$a->setOption(Memcached::OPT_COMPRESSION, false);

$b = new Memcached('memcached_pool');
$b->setOption(Memcached::OPT_COMPRESSION, true);

$a->add('key', 'some data');

?>

您可能會認為連線 $a 會將所有資料儲存為未壓縮的狀態,但事實並非如此。
持久連線選項會被第二個物件建立時所更改。
kangzjnet at gmail dot com
11 年前
要啟用自動容錯移轉,您必須設定 OPT_REMOVE_FAILED_SERVERS 選項,php-memcached 2.0.0b2 或以上版本才支援此選項。

範例如下:
<?php
$memcache
= new Memcached ( 'a_mem_pool' );
$ss = $memcache->getServerList ();
if (empty (
$ss )) {
$memcache->setOption(Memcached::OPT_RECV_TIMEOUT, 1000);
$memcache->setOption(Memcached::OPT_SEND_TIMEOUT, 1000);
$memcache->setOption(Memcached::OPT_TCP_NODELAY, true);
$memcache->setOption(Memcached::OPT_SERVER_FAILURE_LIMIT, 50);
$memcache->setOption(Memcached::OPT_CONNECT_TIMEOUT, 500);
$memcache->setOption(Memcached::OPT_RETRY_TIMEOUT, 300);
$memcache->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT);
$memcache->setOption(Memcached::OPT_REMOVE_FAILED_SERVERS, true);
$memcache->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE, true);
$memcache->addServer ( '10.10.1.75', 11211, 1 );
$memcache->addServer ( '10.10.1.76', 11211, 1 );
$memcache->addServer ( '10.10.1.77', 11211, 1 );
}
?>
To Top