PHP Conference Japan 2024

Memcache::addServer

(PECL memcache >= 2.0.0)

Memcache::addServer新增 memcached 伺服器至連線池

說明

Memcache::addServer(
    字串 $host,
    整數 $port = 11211,
    布林值 $persistent = ?,
    整數 $weight = ?,
    整數 $timeout = ?,
    整數 $retry_interval = ?,
    布林值 $status = ?,
    可呼叫 $failure_callback = ?,
    整數 $timeoutms = ?
): 布林值

Memcache::addServer() 會將伺服器加入連線池。您也可以使用 memcache_add_server() 函式。

當使用這個方法(而不是 Memcache::connect()Memcache::pconnect())時,網路連線會等到實際需要時才會建立。因此,將大量伺服器加入連線池並不會產生額外開銷,即使它們可能不會全部用到。

只要有其他伺服器可用,故障轉移可能會在任何方法的任何階段發生,使用者不會察覺到請求的中斷。任何種類的 socket 或 Memcached 伺服器層級的錯誤(記憶體不足除外)都可能觸發故障轉移。一般的用戶端錯誤,例如新增現有的鍵,則不會觸發故障轉移。

注意事項:

此函式已新增至 Memcache 2.0.0 版。

參數

host

指向 memcached 正在監聽連線的主機。此參數也可以指定其他傳輸方式,例如 unix:///path/to/memcached.sock 來使用 UNIX 網域通訊端,在這種情況下,port 也必須設定為 0

port

指向 memcached 正在監聽連線的埠號。使用 UNIX 網域通訊端時,請將此參數設定為 0

請注意:如果未指定,port 預設為 memcache.default_port。因此,在此方法呼叫中明確指定埠號是明智的做法。

persistent

控制是否使用持久連線。預設為 true(真)。

weight

要為此伺服器建立的桶數量,這反過來控制它被選取的機率。機率與所有伺服器的總權重相關。

timeout

用於連線到 daemon 的秒數值。在更改預設值 1 秒之前請三思 - 如果您的連線太慢,您可能會失去快取的所有優勢。

retry_interval

控制重新嘗試連線失敗的伺服器的頻率,預設值為 15 秒。將此參數設定為 -1 會停用自動重試。當透過 dl() 動態載入擴充功能時,此參數和 persistent 參數皆無效。

每個失敗的連線結構都有自己的逾時時間,在逾時時間到期之前,在選擇後端來服務請求時,該結構將會被略過。一旦逾時,連線將會重新連線成功,或者標記為失敗,並等待另一個 retry_interval 秒。典型的效果是每個網頁伺服器子程序在提供網頁服務時,大約每隔 retry_interval 秒就會重試連線。

status(狀態)

控制伺服器是否應標記為線上。將此參數設定為false,并将 retry_interval 設定為 -1,允許將失敗的伺服器保留在池中,以免影響金鑰分配演算法。根據 memcache.allow_failover 的設定,對此伺服器的請求將會故障轉移或立即失敗。預設值为 true,表示伺服器應被視為線上。

failure_callback

允許使用者指定一個在遇到錯誤時執行的回呼函式。該回呼函式會在嘗試故障轉移之前執行。此函式接受兩個參數:失敗伺服器的主機名稱和連接埠。

timeoutms

返回值

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

範例

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

<?php

/* 物件導向 API */

$memcache = new Memcache;
$memcache->addServer('memcache_host', 11211);
$memcache->addServer('memcache_host2', 11211);

/* 程序式 API */

$memcache_obj = memcache_connect('memcache_host', 11211);
memcache_add_server($memcache_obj, 'memcache_host2', 11211);

?>

注意事項

警告

當未指定 port 時,此方法預設使用 PHP ini 指令 memcache.default_port 的設定值。如果此值在應用程式的其他地方被更改,可能會導致意外的結果:因此,在此方法呼叫中明確指定連接埠是明智之舉。

另請參閱

新增註解

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

rstaveley at seseit dot com
13 年前
Memcache 用戶端程式庫負責挑選正確的伺服器來設定/取得資料。這就是為什麼當您有多個 Memcache 伺服器時,您應該使用 addServer 而不是 connect。後續的設定/取得將會根據需要連線到適當的伺服器執行個體。當您關閉程式或程式碼結束時,就會斷開與所有已連線伺服器的連線。

透過 addServer 新增到 Memcache 物件的 Memcache 執行個體,在您的應用程式中應該以相同的順序新增,以確保使用相同的伺服器來處理相同的鍵值。

用戶端程式庫的實作方式可以是對鍵值執行 CRC 校驗,然後將結果除以清單中執行個體的數量取餘數,以便從清單中選取一個執行個體來進行設定/取得。這確保了資料在各個節點之間的良好分佈。

只要您使用 addServer 以一致的方式新增 Memcache 執行個體清單,這些操作在您的 PHP 程式碼中都會在幕後順利運作。
enno dot rehling at gmail dot com
13 年前
$timeoutms 參數可以用於指定逾時時間(以毫秒為單位),但並非所有版本都支援。例如,它存在於 php_memcache 2.2.6 中,但不存在於 3.0.4 中。在 2.2.6 中,如果您指定它,它將會覆蓋 $timeout。

買者自負:如果未指定 $timeoutms,它會預設為 php.ini 中 memcache.default_timeout_ms 的值,如果未設定,則預設為 1000。這也會覆蓋 $timeout,這會產生一個奇怪的效應,即在 php_memcache 2.2.6 中,$timeout 總是被忽略(優先順序依序為 $timeoutms、memcache.default_timeout_ms 或值 1000)。
joewynn dot nz+phpnet at gmail dot com
11 年前
請注意,此方法將始終返回 TRUE,因為在呼叫時並未實際建立連線。有關更多資訊,請參閱此錯誤報告:https://bugs.php.net/bug.php?id=58193
eu at serbannistor dot ro
13 年前
實際上,如果您有兩個 memcached 伺服器,其中一個位於本機主機上,另一個位於遠端機器上,即使您為本機伺服器指定迴路位址,您仍然可以與這兩個伺服器通訊。

<?php
$memcache_obj
= memcache_connect("127.0.0.1", 11211);
memcache_add_server($memcache_obj, "memcache_remote_host");
$memcache_obj->set('var_key', time());
?>

這將會與兩個主機通訊,但必須考慮兩個方面
1. 與兩個主機的通訊將透過不同的網路介面完成。它將使用迴路介面與「127.0.0.1」主機通訊(在我的 Linux 系統上是 lo),並使用外部介面與「memcache_remote_host」通訊(在我的例子中是 eth0)。只有當您想使用相同的網路介面與兩個主機通訊時,才必須使用兩台機器的外部 IP(所有通訊都將透過 eth0 介面進行)。
2. 由於 memcache_connect() 和 memcache_add_server() 的運作方式不同,與兩個主機的連線建立方式也不同。因此,memcache_connect() 會在被呼叫時透過迴路介面啟動與本機主機的連線,而 memcache_add_server() 只會將第二個伺服器新增到伺服器池中,但除非絕對必要(例如,發出 memcache_set() 命令時),否則它不會透過網路傳送任何封包。
iwind dot liu at gmail dot com
14 年前
伺服器的權重必須大於 0。

如果沒有 memcached 伺服器可用,卻嘗試設定/新增變數,Apache 將會崩潰,並在 error_log 檔案中顯示錯誤訊息 "[notice] child pid 18725 exit signal Segmentation fault (11)"。
Jean-Baptiste Quenot
16 年前
參數 "weight" 的預設值為 1。
To Top