程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> php memcache和memcached模塊安裝應用

php memcache和memcached模塊安裝應用

編輯:關於PHP編程

memcache的官方主頁:php教程.net/package/memcache">http://pecl.php.net/package/memcache
memcached的官方主頁:http://pecl.php.net/package/memcached

以下是我安裝Memcached版本的PHP模塊的過程記錄:

wget http://download.tangent.org/libmemcached-0.48.tar.gz
tar zxf libmemcached-0.48.tar.gz
cd libmemcached-0.48
./configure --prefix=/usr/local/libmemcached --with-memcached
make
make install

wget http://pecl.php.net/get/memcached-1.0.2.tgz
tar zxf memcached-1.0.2.tgz
cd memcached-1.0.2
/usr/local/webserver/php/bin/phpize
./configure --enable-memcached --with-php-config=/usr/local/webserver/php/bin/php-config --with-libmemcached-dir=/usr/local/libmemcached
make
make install

在php.ini中加入
extension=memcached.so
完成

另:
在安裝libmemcached時,如果只用./configure,可能會提示:
checking for memcached… no
configure: error: “could not find memcached binary”


安裝Memcached版本的PHP模塊

wget http://download.tangent.org/libmemcached-0.35.tar.gz
tar zxf libmemcached-0.35.tar.gz
cd libmemcached-0.35
./configure
make
make install

wget http://pecl.php.net/get/memcached-1.0.0.tgz
tar zxf memcached-1.0.0.tgz
cd memcached-1.0.0
phpize
./configure
make
make install

打開php.ini加上:

extension = "memcached.so"

這樣安裝就結束了,你可以通過下列命令來確認:

php -m | grep mem

演示Memcached版本的新功能

先虛構一個問題,假設counter初始值是一個整數,不使用increment方法,通過get/set完成每次加一。

在Memcache版本裡,我們只能按照大致如下的方式來進行:

$m = new Memcache();
$m->addServer('localhost', 11211);
$v = $m->get('counter');
$m->set('counter', $v + 1);

由於get/set這兩個動作無法作為一個原子來操作,所以當多個進程同時處理時,會出現丟失的可能,更讓人惱火的是,你根本就不知道什麼時候出現丟失。

再看看Memcached版本裡,我們是如何做的:

$md = new Memcached();
$md->addServer('localhost', 11211);
$v = $md->get('counter', null, $token)
$md->cas($token, 'counter', $v + 1);

cas是Memcached版本裡提供的功能,說白了就是一個樂觀鎖的功能,如果你把$token的值var_dump出來,就會發現$token其實就是一個版本號,如果通過get得到的$token版本號在cas的時候不對應,就說明已經有別的操作更新了,此時cas操作會失敗,至於如何繼續操作,就看你自己了。

注:如果你想手動重現一下沖突的情況,可在get和cas之間sleep若干秒,並拷貝兩份腳本,先後執行。

順便說一句,推薦的Memcached版本模塊的哈希設置如下:

$md->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT);
$md->setOption(Memcached::OPT_HASH, Memcached::HASH_CRC);

 


兩者使用起來幾乎一模一樣。
復制代碼 代碼如下:
$mem = new Memcache;
$mem->addServer($memcachehost, '11211');
$mem->addServer($memcachehost, '11212');
$mem->set('hx','9enjoy');
echo $mem->get('hx');

復制代碼 代碼如下:
$md = new Memcached;
$servers = array(
array($memcachehost, '11211'),
array($memcachehost, '11212')
);
$md->addServers($servers);
$md->set('hx','9enjoy');
echo $md->get('hx');

memcached的方法比memcache多不少,比如getMulti,getByKey,addServers等。
memcached沒有memcache的connect方法,目前也還不支持長連接。
memcached 支持 Binary Protocol,而 memcache 不支持,意味著 memcached 會有更高的性能。
Memcache是原生實現的,支持OO和非OO兩套接口並存,memcached是使用libmemcached,只支持OO接口。
更詳細的區別:http://code.google.com/p/memcached/wiki/PHPClientComparison


memcached服務端是集中式的緩存系統,分布式實現方法是由客戶端決定的。
memcached的分布算法一般有兩種選擇:
1、根據hash(key)的結果,模連接數的余數決定存儲到哪個節點,也就是hash(key)% sessions.size(),這個算法簡單快速,表現良好。然而這個算法有個缺點,就是在memcached節點增加或者刪除的時候,原有的緩存數據將大規模失效,命中率大受影響,如果節點數多,緩存數據多,重建緩存的代價太高,因此有了第二個算法。
2、Consistent Hashing,一致性哈希算法,他的查找節點過程如下:
首先求出memcached服務器(節點)的哈希值,並將其配置到0~232的圓(continuum)上。然後用同樣的方法求出存儲數據的鍵的哈希值,並映射到圓上。然後從數據映射到的位置開始順時針查找,將數據保存到找到的第一個服務器上。如果超過2的32次方後仍然找不到服務器,就會保存到第一台memcached服務器上。

memcache在沒有任何配置的情況下,是使用第一種方法。memcached要實現第一種方法,似乎是使用(未確認):
$md->setOption(Memcached::OPT_HASH, Memcached::HASH_CRC);

第二種一致性哈希算法:

memcache在php.ini中加
復制代碼 代碼如下:
Memcache.hash_strategy =consistent
Memcache.hash_function =crc32

memcached在程序中加(未確認)
復制代碼 代碼如下:
$md->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT);
$md->setOption(Memcached::OPT_HASH, Memcached::HASH_CRC);

$mem->setOption(Memcached::OPT_DISTRIBUTION,Memcached::DISTRIBUTION_CONSISTENT);
$mem->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE,true);

一些參考文檔:
memcached分布測試報告(一致性哈希情況下的散列函數選擇):
http://www.iteye.com/topic/346682
php模塊memcache和memcached區別: http://www.jb51.net/article/27366.htm
PHP模塊:Memcached > Memcache:http://www.jb51.net/article/27367.htm

20110509@@UPDATE:
如果安裝libmemcached有如下出錯提示:
make[2]: *** [clients/ms_conn.o] Error 1
make[2]: Leaving directory `/www/soft/libmemcached-0.48'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/www/soft/libmemcached-0.48'
make: *** [all] Error 2

可在configure時增加--disable-64bit CFLAGS="-O3 -march=i686"
即:./configure --prefix=/usr/local/libmemcached --with-memcached --disable-64bit CFLAGS="-O3 -march=i686"


分析

memcache:http://cn2.php.net/manual/en/book.memcache.php
memcached:http://cn2.php.net/manual/en/book.memcached.php
2.Memcache是原生實現的,支持OO和非OO兩套接口並存。而memcached是使用libmemcached,只支持OO接口。
3.memcached還有個非常稱贊的地方,就是flag不是在操作的時候設置了,而是有了一個統一的setOption()。Memcached實現了更多的memcached協議。
4.memcached支持Binary Protocol,而memcache不支持。這意味著memcached會有更高的性能。不過memcached目前還不支持長連接。

下面有一張表,來對比php客戶端擴展memcache與memcached
http://code.google.com/p/memcached/wiki/PHPClientComparison

另外一點也是大家比較關心的,就是所使用的算法。大家都知道“一致性hash算法”是當添加或刪除存儲節點時,對存儲在memcached上的數據影響較小的一種算法。那麼在php的兩個擴展庫中,都可以使用該算法,只是設置方法有所不同。
Memcache
修改php.ini添加:
[Memcache]
Memcache.allow_failover = 1
……
……
Memcache.hash_strategy =consistent
Memcache.hash_function =crc32
……
……
或在php中使用ini_set方法:
Ini_set(‘memcache.hash_strategy','standard');
Ini_set(‘memcache.hash_function','crc32');

Memcached
$mem = new memcached();
$mem->setOption(Memcached::OPT_DISTRIBUTION,Memcached::DISTRIBUTION_CONSISTENT);
$mem->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE,true);


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved