PHP Conference Japan 2024

Memcached::addServer

(PECL memcached >= 0.1.0)

Memcached::addServer新增伺服器到伺服器池

說明

public Memcached::addServer(字串 $host, 整數 $port, 整數 $weight = 0): 布林值

Memcached::addServer() 會將指定的伺服器加入伺服器池。此時不會建立與伺服器的連線,但如果您使用一致性雜湊分配選項(透過 Memcached::DISTRIBUTION_CONSISTENTMemcached::OPT_LIBKETAMA_COMPATIBLE),則必須更新一些內部資料結構。因此,如果您需要新增多個伺服器,最好使用 Memcached::addServers(),因為更新只會發生一次。

同一個伺服器可能會在伺服器池中出現多次,因為不會進行重複檢查。這並不建議;相反地,請使用 weight 選項來增加此伺服器的選取權重。

參數

host

memcache 伺服器的主機名稱。如果主機名稱無效,與資料相關的操作將會設定 Memcached::RES_HOST_LOOKUP_FAILURE 結果代碼。從 2.0.0b1 版本開始,此參數也可以指定 unix socket 檔案路徑,例如 /path/to/memcached.sock 來使用 UNIX 域套接字,在這種情況下,port 也必須設定為 0

port

memcache 執行的埠號。通常是 11211。從 2.0.0b1 版本開始,使用 UNIX 域套接字時,請將此參數設定為 0

weight

伺服器相對於池中所有伺服器總權重的權重。這控制了伺服器被選中進行操作的機率。這僅與一致性分配選項一起使用,通常對應於該伺服器上 memcache 可用的記憶體量。

返回值

成功時返回 true,失敗時返回 false

範例

範例 #1 Memcached::addServer() 範例

<?php
$m
= new Memcached();

/* 新增 2 個伺服器,讓第二個伺服器
被選中的可能性是第一個的兩倍。 */
$m->addServer('mem1.domain.com', 11211, 33);
$m->addServer('mem2.domain.com', 11211, 67);
?>

參見

新增註釋

使用者貢獻的註釋 3 則註釋

mbarriolinares at gmail dot com
12 年前
很重要的一點是,不要每次執行都呼叫 ->addServers() -- 只有在伺服器不存在時才呼叫它(檢查 getServerList());否則,由於 addServers() 不會檢查重複項,它會讓你一次又一次地添加相同的伺服器,導致與 MC 常駐程式建立數百甚至數千個連線。尤其是在使用 FastCGI 時。

範例

<?php
class Cache {
private
$id;
private
$obj;

function
__construct($id){
$this->id = $id;
$this->obj = new Memcached($id);
}

public function
connect($host , $port){
$servers = $this->obj->getServerList();
if(
is_array($servers)) {
foreach (
$servers as $server)
if(
$server['host'] == $host and $server['port'] == $port)
return
true;
}
return
$this->obj->addServer($host , $port);
}

}
?>
Dave
12 年前
從 2.0.0b1 版本開始,您可以使用 Unix socket。

<?php
$m
= new Memcached();
$m->addServer('/path/to/socket',0);
?>

不要與使用 'unix:///path/to/socket' 的 Memcache 混淆。
Robbie De Lise
13 年前
在我的 Debian Squeeze 系統上,我收到寫入失敗錯誤。經過除錯,最後使用 tcpdump 後,似乎問題出在我添加伺服器「localhost」,它解析為「::1」(IPv6),而 Debian 上的預設 memcached 伺服器只監聽「127.0.0.1」(IPv4)。DNS 會自動優先選擇 IPv6 而不是 IPv4。

我改為添加伺服器「127.0.0.1」,一切就正常了。您也可以停用 IPv6 或讓 memcached 監聽 ::1。
To Top