たとえば、PECL には Memcache と Memcached という 2 つの Memcached モジュールがあります。現在、ほとんどの PHP 環境では、名前に d が含まれていない Memcache バージョンが使用されており、d が含まれる Memcached バージョンは libmemcached に基づいています。 , そのため、Memcached バージョンの方が機能が充実しています。
PHP モジュールの Memcached バージョンをインストールします
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 を通じて毎回 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 すると、get で取得した $token のバージョン番号が cas に対応していないことがわかります。それは、他の操作が更新されたことを意味します。今回は、cas 操作が失敗した場合、どのように続行するかはあなた次第です。
注: 競合状況を手動で再現したい場合は、get と cas の間で数秒スリープし、2 つのスクリプトをコピーして、順番に実行します。
ちなみに、Memcached バージョンモジュールの推奨ハッシュ設定は以下の通りです:
$md->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT);
$md->setOption(Memcached::OPT_HASH, Memcached: :HASH_CRC);
概要
Memcached バージョンには、getByKey、setByKey などを介して複数のサーバーを自動的にサポートするなど、Memcache にはない多くの機能もあります。どの拡張機能を使用するかは、詳細には説明しません。明らか。
補足: http://code.google.com/p/memcached/wiki/PHPClientComparison
上記では、memcache のコンテンツを含め、Memcache より多くの機能を備えた PHP モジュールを紹介しました。PHP チュートリアルに興味のある友人に役立つことを願っています。