2010年8月3日 星期二

用memcache來存儲session

PECL :: Package :: memcache 2.1.1 版本的Changelog 中有一條:

- Added experimental session storage support. You can use memcached as session storage.

也就是可以直接用memcache 來作PHP 的session.save_handler。

1. 安裝memcached

還是那套./configure; make; make install,注意memcached 用libevent 來作事件驅動,所以要先安裝有libevent。

2. 安裝pecl::memcache,用pecl 命令行工具安裝:

pecl install memcache

或直接從源碼安裝:

phpize

./configure

make

make install

將php.ini 中extension=memcache.so 打開,重啟一下apache,查看phpinfo 中的“Registered save handlers” 會有“files user memcache” 這3個可用。

3. 修改配置文件,在php.ini 中全局設置:

session.save_handler = memcache

session.save_path = “tcp://127.0.0.1:11211″

或者某個目錄下的.htaccess :

php_value session.save_handler “memcache”

php_value session.save_path “tcp://127.0.0.1:11211″

再或者在某個一個應用中:

ini_set(“session.save_handler”, “memcache”);

ini_set(“session.save_path”, “tcp://127.0.0.1:11211″);

使用多個memcached server 時用逗號”,”隔開,並且和Memcache::addServer() 文檔中說明的一樣,可以帶額外的參數”persistent”、”weight”、”timeout”、”retry_interval” 等等,類似這樣的:”tcp://host1:port1?persistent=1&weight=2,tcp://host2:port2″ 。

4. 啟動memcached:

memcached -d -l 127.0.0.1 -p 11212 -m 128

5. 在程序中使用memcache 來作session 存儲,用例子測試一下:

session_start();

if (!isset($_SESSION['TEST'])) {

$_SESSION['TEST'] = time();

}

$_SESSION['TEST3'] = time();

print $_SESSION['TEST'];

print “

”;

print $_SESSION['TEST3'];

print “

”;

print session_id();

6. 用sessionid 去memcached 裡查詢一下:

$memcache = memcache_connect('localhost', 11211);

var_dump($memcache->get('19216821213c65cedec65b0883238c278eeb573e077′));

會有看到

string(37) “TEST|i:1177556731;TEST3|i:1177556881;”

這樣的輸出,證明session 正常工作。

用memcache 來存儲session 在讀寫速度上會比files 時快很多,而且在多個服務器需要共用session 時會比較方便,將這些服務器都配置成使用同一組memcached 服務器就可以,減少了額外的工作量。 缺點是session 數據都保存在memory 中,持久化方面有所欠缺,但對session 數據來說也不是很大的問題。

另外,WS Memcached Session Handler for PHP 提供一種用session_set_save_handler 來利用memcached 的方法。

沒有留言:

wibiya widget