Do You PHP はてブロ

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

memcachedに登録されているすべてのキーを抜き出す

先ほどのmemcacheの件の続き。
Protocol docsには、先ほど使ったコマンド

stats cachedump

の説明がありません。どっかにないな?かとググってみると、やたらとPHPマニュアルが引っかかりました。

え?ひょっとして、これがそうなの?てっきりダメなのかと思ってた。。。
ちなみに

でも同様のようです。
ということで、PHP+memcache+Repcachedを試してみた みたび - Do You PHP はてなにあるコードを元にした、以下のようなコードで確認。

<?php
$servers = array(array('ip' => '192.168.121.130', '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()) {
    echo 'failed to connect to server<br/>';
}

$version = $memcache->getVersion();
echo 'server version: '.$version.'<br/>';

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)) {
        var_dump(@$memcache->getExtendedStats());
        die ('failed to save data');
    }
}


/**
 * 統計情報からすべてのキーを抜き出す
 */
$all_keys = array();
$slabs = $memcache->getExtendedStats('slabs');
foreach ($servers as $server) {
    $current_server = sprintf('%s:%s', $server['ip'], $server['port']);
    if (!array_key_exists($current_server, $slabs)) {
        continue;
    }
    foreach (array_keys($slabs[$current_server]) as $key) {
        if ($key !== 'active_slabs' && $key !== 'total_malloced') {
            $keys = array_flip(array_keys($memcache->getStats('cachedump', $key, 10000)));
            $all_keys += $keys;
        }
    }
}

var_dump(count($all_keys));
var_dump($all_keys);

実行結果は次の通り。

added server 192.168.121.130:11211
added server 127.0.0.1:11211
server version: 1.2.5

int 100

array
  'key99' => int 0
  'key98' => int 1
  'key96' => int 2
  'key95' => int 3
  'key94' => int 4
  'key93' => int 5
  'key97' => int 6
  'key92' => int 7
  'key91' => int 8
          :

PHP+memcache拡張だけでどうにかなりそうです。