2006年11月6日

在 Windows 上安裝 Memcached

說明

memcached 是一個分散式的物件快取系統,只要有適當的 API ,任何有支援的程式語言都可以用它來存放相關的變數資訊。例如我們可以利用 memcached 來管理 PHP 的 Session ,提高 Web 網站的運作效能。


安裝

這裡安裝的是 memecached for Win32 版本,其他平台的版本可以到 memcached 官方網站下載。

  1. 請到 memcached for Win32 下載最新的版本,這裡我下載的是 memcached 1.2.0 release candidate 1b for Win32 binaries

  2. 將 memcached-1.2.0-rc1b-win32.zip 解壓縮至 D:\Appserv\memcached 下。 (其實放哪兒都可以,這裡我只是為了說明方便。)

  3. 打開 Command Line 視窗,切換到 D:\Appserv\memcached ,並輸入以下指令:

    D:\Appserv\memcached>sc create memcached binPath= "D:\Appserv\memcached\memcached.exe -p 9999 -l 127.0.0.1 -m 128 -d runservice" DisplayName= "memcached server" start= auto depend= TCPIP

    其中 -p 9999 是指透過 port 9999 監聽請求 (預設為 11211 ) , -l 127.0.0.1 是指伺服器指定的 IP 位址 (預設為 INDRR_ANY) , -m 128 是指 memcached 最大可用的記憶體為 128 MB (預設 64 MB) ,最後 -d runservice 就是啟動為 Windows 服務。

    註: memcached for Win32 有提供 -d install 指令,但是無法指定 port 及記憶體大小,故不建議使用。

  4. 完成後就可以到服務管理員啟動 memcached 服務。

測試

這裡我用的是 PHP 5.2 ,當然你可以使用任何一種支援 memcached 的語言來測試。

  1. 首先我們得到 PECL for Win 去下載 memcached for PHP 的函式庫 (php_memcache.dll) ,這裡當然要下載 5.2.0 對應的版本。

  2. 把 php_memcache.dll 下載回來後把它丟到 PHP 安裝目錄下的 ext 資料夾。

  3. 在 php.ini 裡加入:

    extension=php_memcache.dll
  4. 重新啟動 Apache 或 IIS ,如果要跑的是 CLI 模式的話就不用了。

好了,接下來先看看以下的程式,我是用 CLI 模式來執行它。

先用 Memcache 類別連接到 memcached 伺服器:

$memcache = new Memcache;
$memcache->connect('localhost', 9999) or die ("Could not connect");

然後我們可以用以下程式來得知 memcached 的版本:

$version = $memcache->getVersion();
echo "Server's version: ".$version."\n";

試試建立一個 stdClass 物件,然後用 Memcache 的 set 方法把它存到 memcached 伺服器上:

$tmp_object = new stdClass;
$tmp_object->str_attr = 'test';
$tmp_object->int_attr = 123;
$tmp_object->time_attr = time();

echo "要儲存的資料:\n";
var_dump($tmp_object);

$memcache->set('key', $tmp_object, false, 10) or die ("Failed to save data at the server");
echo "將資料存入 Cache 中 (10 秒後失效)\n";

能存進去就要能拿回來,我們可以用 Memcache 的 get 方法來完成。不過在拿之前,先暫停個 5 秒,看看這個物件是不是還活著:

sleep(5);

echo "第一次從 Cache 中取回資料\n";
$get_result = $memcache->get('key');

var_dump($get_result);

再來一次,這次應該是找不到了:

sleep(5);

echo "第二次從 Cache 中取回資料\n";
$get_result = $memcache->get('key');

var_dump($get_result);

整個完整執行結果如下:

Server's version: 1.2.0-rc1
要儲存的資料:
object(stdClass)#2 (3) {
  ["str_attr"]=>
  string(4) "test"
  ["int_attr"]=>
  int(123)
  ["time_attr"]=>
  int(1162804936)
}
將資料存入 Cache 中 (10 秒後失效)
第一次從 Cache 中取回資料
object(stdClass)#3 (3) {
  ["str_attr"]=>
  string(4) "test"
  ["int_attr"]=>
  int(123)
  ["time_attr"]=>
  int(1162804936)
}
第二次從 Cache 中取回資料
bool(false)

當然這只是小試一下,真正在實作上,我們應該先判斷物件是不是存在於 memcached 伺服器,沒有的話就自己生一個,再存回 memcached 伺服器上。程式實作如下:

<?php

$memcache = new Memcache;
$memcache->connect('localhost', 9999) or die ("Could not connect");

$version = $memcache->getVersion();
echo "Server's version: ".$version."\n";

echo "從 Cache 中取回資料\n";
$get_result = $memcache->get('key');

// 沒有資料
if (!$get_result)
{
    // 自己生一個
    $tmp_object = new stdClass;
    $tmp_object->str_attr = 'test';
    $tmp_object->int_attr = 123;
    $tmp_object->time_attr = time();

    echo "要儲存的資料:\n";
    var_dump($tmp_object);

    $memcache->set('key', $tmp_object, false, 10) or die ("Failed to save data at the server");
    echo "將資料存入 Cache 中 (10 秒後失效)\n";
}

echo "從 Cache 中取回資料\n";
$get_result = $memcache->get('key');

var_dump($get_result);

我們還可以用 addServer 方法來同時連接多個 memcached 伺服器,這裡就不多談了。

安全性

目前 memcached 似乎沒有好的認證機制,所以只要知道 port 以及 key ,就能夠長驅直入,對 memcached 中的資料做存取。所以最好能夠利用防火牆等外部工具,對相關的存取權限做好設定,避免攻擊事件發生。

參考資料


Posted by jaceju at 樂多Roodo! │17:31 │回應(0)伺服器安裝與設定
樂多分類:網路/3C 共同主題:伺服器安裝與設定 工具:加入樂多書籤編輯本文
Ads by Roodo!