在 ServBay 中使用 Memcached 進行 PHP 資料快取
ServBay 作為一款強大的本機 Web 開發環境,預先內建高效能的 Memcached 套件(Memcached 伺服器)以及對應的 PHP 擴充套件,開發者能夠輕鬆於 PHP 應用中實現高效資料快取,顯著提升應用效能。
本文將詳細介紹如何於 ServBay 中確認並使用 Memcached 及其對應的 PHP 擴充套件。
Memcached 簡介
Memcached 是一套高效能、分散式的記憶體物件快取系統。其藉由將資料(如資料庫查詢結果、API 回應、網頁片段等)暫時存放於記憶體中,減少對後端儲存(如資料庫)的存取次數,進而加速動態 Web 應用的反應速度與吞吐量。
主要特點
- 高效能:資料存於記憶體中,讀寫速度極快。
- 分散式擴充:支援於多台伺服器間建立分散式快取池,方便彈性擴充。
- 簡單易用:協定簡單、客戶端函式庫豐富,整合快速便利。
- 降低資料庫負載:有效減輕資料庫查詢壓力,特別是在高併發情境下。
memcache
與 memcached
PHP 擴充套件之差異
在 PHP 中,連線至 Memcached 伺服器主要有兩個常見擴充套件:memcache
及 memcached
。雖名稱相似,但其實為兩個不同專案,提供的 API 與功能也有所不同:
memcache
擴充套件:- 早期 PHP 用戶端。
- 主要提供程序導向 API(如
memcache_connect()
,memcache_set()
等)。 - 功能較為基礎,不支援某些進階功能,如一致性雜湊(部分客戶端函式庫有自行實作)。
memcached
擴充套件:- 較新的 PHP 擴充套件(基於 libmemcached 函式庫)。
- 提供物件導向 API(
Memcached
類別)。 - 支援更多進階特性,如一致性雜湊、二進位協定、SASL 驗證、更彈性的序列化選項等。
- 通常建議使用
memcached
,因功能較強且維護較為活躍。
ServBay 預設提供並推薦功能更完整的 memcached
PHP 擴充套件。
ServBay 內之 Memcached 套件與 PHP 擴充套件
ServBay 不僅內建 Memcached 伺服器(可控套件),同時針對內建各 PHP 版本預先安裝並預設啟用 memcached
PHP 擴充套件。
這表示多數情況下,安裝 ServBay 後,Memcached 伺服器與 PHP 擴充套件皆已就緒,無需額外編譯或調整 PHP 設定。
確認 Memcached 套件狀態:
您可於 ServBay 主界面或套件管理介面中尋找 Memcached
套件,確認其狀態為「執行中」。若尚未運作,請嘗試啟動它。
確認 memcached
PHP 擴充套件已載入:
想確認特定 PHP 版本是否成功載入 memcached
擴充套件,最簡單方法是運用 phpinfo()
函式:
於 ServBay 網站根目錄(預設為
/Applications/ServBay/www
)新建一個 PHP 檔案,例如info.php
。檔案內容如下:
php<?php phpinfo(); ?>
1
2
3透過 ServBay 所設定的本機網站開啟該檔案(若您的網站網域為
servbay.demo
,則訪問http://servbay.demo/info.php
)。於顯示的
phpinfo
頁面內搜尋關鍵字 "memcached"。如畫面上可看到名為 "memcached" 的區塊,顯示其配置信息與版本號,表示該擴充套件已成功載入且可用。
於 PHP 程式碼中使用 Memcached
確認 Memcached 伺服器已運作且 memcached
PHP 擴充套件已啟用,即可在 PHP 應用中透過 Memcached
類連接伺服器並執行快取操作。
Memcached 伺服器預設運作於 localhost
,端口為 11211
。
範例程式碼
以下是簡單 PHP 程式碼範例,說明如何用 Memcached
類連接本機 Memcached 伺服器並完成資料儲存與讀取:
將以下程式碼存為 ServBay 網站目錄下的某個 PHP 檔案(範例路徑 /Applications/ServBay/www/memcached_test.php
):
<?php
// Memcached 伺服器資訊
$memcached_host = 'localhost';
$memcached_port = 11211;
// 建立 Memcached 客戶端實例
$memcached = new Memcached();
// 將 Memcached 伺服器加入客戶端連線池
// addServer() 方法回傳布林值,表示是否成功加入列表,並不代表連線已建立
if (!$memcached->addServer($memcached_host, $memcached_port)) {
// 注意:addServer 失敗通常表示設定問題,而非真的無法聯通伺服器
die("無法將 Memcached 伺服器加入客戶端連線清單。請檢查主機與端口設定。");
}
// 嘗試取得尚不存在的 key 測試連線(可選但建議)
// get() 回傳 false 或空陣列,表示 key 不存在或連線異常
// 可使用 Memcached::getResultCode() 取得詳細狀態碼
$test_key = 'servbay_memcached_connection_test';
$memcached->get($test_key); // 嘗試取得不存在的 key
$result_code = $memcached->getResultCode();
if ($result_code !== Memcached::RES_NOTFOUND && $result_code !== Memcached::RES_SUCCESS) {
// 非 RES_NOTFOUND 與 RES_SUCCESS,可能代表連線異常
// 注意:RES_SUCCESS 亦可能於取得空值時回傳
// 更嚴謹的連線檢查,可能需依應用邏輯或客戶端行為調整
// 本地開發環境下,通常 addServer 成功且後續執行未報錯即認定連線正常
echo "注意:連接 Memcached 伺服器時可能存在問題。Result Code: " . $result_code . "<br>";
// 實際應用建議增強錯誤處理邏輯
} else {
echo "成功連接至 Memcached 伺服器 ({$memcached_host}:{$memcached_port})。<br>";
}
// --- 快取操作範例 ---
// 要快取的資料
$key = 'user_profile_1234';
$data = [
'id' => 1234,
'username' => 'servbay-demo',
'email' => '[email protected]',
'status' => 'active'
];
$expiration = 3600; // 快取過期時間,單位:秒(本例為 1 小時)
// 設定快取資料
// set() 回傳布林值,表示是否設置成功
if ($memcached->set($key, $data, $expiration)) {
echo "資料已成功快取至 Memcached,鍵名 '{$key}',有效 {$expiration} 秒。<br>";
} else {
echo "快取資料失敗!<br>";
// 可用 $memcached->getResultCode() 取失敗原因
echo "Result Code: " . $memcached->getResultCode() . "<br>";
}
// 嘗試從快取取得資料
echo "嘗試從快取中取得資料...<br>";
$cachedData = $memcached->get($key);
if ($cachedData !== false) { // Memcached::get() 遇快取沒命中或錯誤時回傳 false
echo "成功自快取取得資料:<br>";
echo "<pre>";
print_r($cachedData);
echo "</pre>";
} else {
echo "快取沒命中或讀取失敗,鍵名 '{$key}'。<br>";
echo "Result Code: " . $memcached->getResultCode() . "<br>";
}
// 示範快取過期情境(假設時間已經推移)
// 實務應用請在 $cachedData 為 false 時重新讀取來源(如資料庫)後再寫入快取
// 範例:刪除快取資料
/*
echo "嘗試刪除快取資料...<br>";
if ($memcached->delete($key)) {
echo "資料已成功從快取移除,鍵名 '{$key}'。<br>";
} else {
echo "刪除快取資料失敗!<br>";
echo "Result Code: " . $memcached->getResultCode() . "<br>";
}
// 再次嘗試取得已刪除的資料
echo "再次嘗試取得已刪除的資料...<br>";
$cachedDataAfterDelete = $memcached->get($key);
if ($cachedDataAfterDelete !== false) {
echo "仍取得到資料(刪除失敗):<br>";
print_r($cachedDataAfterDelete);
} else {
echo "資料已不在快取中(符合預期)。<br>";
echo "Result Code: " . $memcached->getResultCode() . "<br>";
}
*/
// 範例:清空所有快取(請謹慎操作!)
/*
echo "嘗試清空所有快取...<br>";
if ($memcached->flush()) {
echo "已清空所有快取資料。<br>";
} else {
echo "清除快取失敗!<br>";
echo "Result Code: " . $memcached->getResultCode() . "<br>";
}
*/
?>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
透過 ServBay 設定的本機網站存取 memcached_test.php
,可看到連線狀態與資料設定、讀取的結果畫面。
注意事項
- 確認 Memcached 套件於 ServBay 中為執行中狀態。
- Memcached 預設監聽在
127.0.0.1
(或localhost
)的11211
端口,通常無需修改。 - 若 PHP 端無法連線,請檢查 Memcached 套件運作狀態或確認本地網路設定(如防火牆未封鎖連線)。
Memcached
類別之addServer
僅是把伺服器加入待選池,實際連線與操作須於之後呼叫get
、set
等方法時進行。可依照這些方法的回傳值或getResultCode()
判斷快取連線是否成功。
總結
ServBay 為開發者帶來極致便利的 Memcached 使用體驗。透過整合的 Memcached 伺服器與預先安裝啟用的 memcached
PHP 擴充套件,無需繁雜安裝與設定即可於本機開發環境中快速高效地運用 Memcached,為構建高效能 PHP 應用奠定穩固基礎。