Do You PHP はてブロ

Do You PHPはてなからはてブロに移動しました

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 まあ、こんな重箱の隅をつつくよりは、他のところに気をつけた方がコスト削減(パフォーマンス改善)になりそうな感じですね。