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拡張だけでどうにかなりそうです。