PHP+memcache+Repcachedを試してみた みたび
先日KLabラボさんから公開されているRepcachedを試してみました(これとこれ)が、2008/04/11付けでマルチマスタレプリケーションに対応した新しいバージョンがリリースされたので、みたび試してみました。
環境は先日と同様CentOS4.6 on VMwarePlayerで仮想NICは1枚、NAT接続ですが、VMwarePlayerをバージョンアップした関係で、IPアドレスが192.168.141.128に変わりました。PHPのバージョンは前回と変わらず5.2.5で、memcache拡張は3.0.1(beta)です。
インストール、起動法は前回までと同じなので割愛。。。PHPスクリプトは以下のようにaddServerメソッドを使うよう変更しました。
<?php $ttl = 60; $servers = array(array('ip' => '192.168.141.128', 'port' => 11211), array('ip' => '127.0.0.1', 'port' => 11211)); $persistent = false; $memcache = new Memcache(); foreach ($servers as $server) { $ip = $server['ip']; $port = $server['port']; if (@$memcache->addServer($ip, $port, $persistent)) { printf('added server %s:%s<br/>', $ip, $port); } } if (@!$memcache->getStats()) { die('failed to connect to server'); } $version = $memcache->getVersion(); echo 'server version: '.$version.'<br/>'; $get_result = $memcache->get('key99'); echo 'cached data:<br/>'; var_dump($get_result); if (!$get_result) { for ($i = 0; $i < 100; $i++) { $obj = new stdClass; $obj->str = 'test' . $i; $obj->int = $i; $obj->date = microtime(); if (!$memcache->set('key' . $i, $obj, false, $ttl)) { die ('failed to save data'); } } echo 'date:' . $obj->date. '<br/>'; echo 'saved data (TTL=' . $ttl . ')<br/>'; } var_dump(@$memcache->getExtendedStats());
ブラウザから数回アクセスすると
added server 192.168.141.128:11211 added server 127.0.0.1:11211 server version: 1.2.5 cached data: object(stdClass)[2] public 'str' => string 'test99' (length=6) public 'int' => int 99 public 'date' => string '0.13059900 1208010358' (length=21) array '192.168.141.128:11211' => array :
のように表示され、その後Repcachedを縮退/復帰させた状態で再度アクセスしても、問題なくキャッシュを取得できました。スバラシイ!
で、一点。
上のコードでは、永続的接続(persistent)をfalseにして、毎回接続/切断させています。理由は、縮退運転から復帰したときにRepcachedサーバに接続できずにキャッシュを取りこぼす事があったためです。これって、oci_pconnectとかと同じで、クライアントであるmemcache拡張側の問題だろうと思いますが。
また、毎回接続/切断するコストがどれぐらいなのか気になるところですが、逆にpersistentにしたところでどのくらい効果があるのかも気になりますw まあ、こんな重箱の隅をつつくよりは、他のところに気をつけた方がコスト削減(パフォーマンス改善)になりそうな感じですね。