memcache の公式ホームページ: phptutorial.net/package/memcache">http://pecl.php.net/package/memcache
memcached の公式ホームページ: http://pecl.php.net/package/memcached
以下これは、PHP モジュールの Memcached バージョンをインストールするプロセスの記録です:
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を追加
Complete
別:
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 バージョンの新機能をデモンストレーションします
まず、次のことを前提として問題を作成します。カウンタの初期値は整数です。インクリメントメソッドは使用せず、get/set を行うたびに 1 ずつインクリメントします。
Memcache バージョンでは、次のように続行することしかできません:
$m = new Memcache();
$m->addServer('localhost', 11211);
$v = $m- >get( 'counter');
$m->set('counter', $v + 1);
get/setの2つのアクションはアトムとして操作できないため、複数の処理を同時に処理する場合、紛失する可能性があり、さらに厄介なのは、いつ紛失するかわからないことです。
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 の間に数秒間スリープし、2 つのスクリプトをコピーして、順番に実行します。
ちなみに、Memcached バージョンモジュールの推奨ハッシュ設定は以下の通りです:
$md->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT);
$md->setOption(Memcached:: OPT_HASH, Memcached::HASH_CRC);
この 2 つの使い方はほぼ同じです。
次のようにコードをコピーします:
$mem = new Memcache;
$mem->addServer($memcachehost, '11212'); > ;set('hx','9enjoy');
echo $mem->get('hx');
次のようにコードをコピーします。
$servers = array(
array ($ memcachehost, '11211'),
array($memcachehost, '11212')
);
$md->addServers($servers); ;
echo $md->get('hx');
memcached には、getMulti、getByKey、addServers など、memcache よりも多くのメソッドがあります。
memcached には memcache の connect メソッドがなく、現時点では長い接続をサポートしていません。
Memcache はネイティブに実装されており、OO インターフェイスと非 OO インターフェイスの両方の共存をサポートします。memcached は libmemcached を使用し、OO インターフェイスのみをサポートします。
詳しい違い: http://code.google.com/p/memcached/wiki/PHPClientComparison
memcached サーバーは集中型キャッシュ システムであり、分散実装方法はクライアントによって決定されます。
Memcached の分散アルゴリズムには通常 2 つのオプションがあります:
1. hash(key) の結果に従って、モジュラー接続番号の残りが格納されるノード、つまり hash(key)%sessions.size() によって決まります。アルゴリズムはシンプルで高速、優れたパフォーマンスです。ただし、このアルゴリズムには欠点があり、memcached ノードを追加または削除すると、元のキャッシュ データが大規模に無効になり、ノードやキャッシュ データが多数ある場合、ヒット率に大きな影響を与えます。キャッシュを再構築するコストが高すぎるため、2 番目のアルゴリズムを使用します。
2. Consistent Hashing、一貫したハッシュアルゴリズム、そのノード検索プロセスは次のとおりです:
最初に memcached サーバー (ノード) のハッシュ値を見つけ、それを 0 から 232 までのサークル (連続体) 上に設定します。次に、同じ方法を使用して、データを保存しているキーのハッシュ値を見つけ、それをサークルにマッピングします。次に、データがマッピングされている場所から時計回りに検索し、最初に見つかったサーバーにデータを保存します。 2 の 32 乗を超えてもサーバーが見つからない場合は、最初の memcached サーバーに保存されます。
memcache は、設定を行わずに最初の方法を使用します。最初のメソッドを実装するために、memcached は (未確認) を使用するようです:
$md->setOption(Memcached::OPT_HASH, Memcached::HASH_CRC);
2 番目の一貫したハッシュ アルゴリズム:
memcache in Add
Copy code php.ini を次のように編集します:
Memcache.hash_strategy =consistent
Memcache.hash_function =crc32
memcached がプログラムに追加されます (未確認)
コードを次のようにコピーします:
$md->setOption(Memcached: ;
$mem ->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE,true);
いくつかの参考ドキュメント:
memcached 配布テスト レポート (一貫したハッシュの場合のハッシュ関数の選択):
PHP モジュール memcache と memcached の違い: http://www.jb51.net/article/27366.htm
PHP モジュール: Memcached > Memcache: http://www.jb51.net/article/27367
20110509@@UPDATE:
libmemcached をインストールすると、次のエラー メッセージが表示されます:
make[2]: *** [clients/ms_conn.o] エラー 1
make[1]: *** [all-recursive] エラー 1
make[1]: ディレクトリ `/www/soft/libmemcached-0.48' を離れます
make: *** [all] エラー 2
configure 時に --disable-64bit CFLAGS="-O3 -march=i686" を追加できます
つまり: ./configure --prefix=/usr/local/libmemcached --with-memcached --disable-64bit CFLAGS ="- O3 -march=i686"
分析
memcached:http://cn2.php.net/manual /en/ book.memcached.php
2.Memcache はネイティブに実装され、OO インターフェイスと非 OO インターフェイスの共存をサポートします。 Memcached は libmemcached を使用し、OO インターフェイスのみをサポートします。
4.memcached はバイナリ プロトコルをサポートしていますが、memcache はサポートしていません。これは、memcached のパフォーマンスが高いことを意味します。ただし、memcached は現在、長時間接続をサポートしていません。
以下に、PHP クライアント拡張機能の memcache と memcached を比較する表があります
http://code.google.com/p/memcached/wiki/PHPClientComparison
Memcache
php.ini を変更して次を追加します:
Memcache.allow_failover = 1
…
…
Memcache.hash_strategy =consistent
Memcache.hash_function =crc32
…
…
またはPHP の ini_ セットメソッド:
Ini_set('memcache.hash_strategy','standard');
Ini_set('memcache.hash_function','crc32');
Memcached
$mem = new memcached();
$mem->setOption( Memcached:: OPT_DISTRIBUTION,Memcached::DISTRIBUTION_CONSISTENT);