Memcached::getAllKeys

(PECL memcached >= 2.0.0)

Memcached::getAllKeysすべてのサーバーのキーを取得する

説明

public Memcached::getAllKeys(): array|false

Memcached::getAllKeys() は、 個々の memcache サーバーに問い合わせて、その時点で格納されているすべてのキーの配列を取得します。 これはアトミックな操作ではないので、ある時点でのすべてのキーのスナップショットを真の意味で取得したとは言えません。 また、memcache はすべてのキーを返すことを保証しないので、 すべてのキーを取得したものとみなすこともできません。

注意:

このメソッドはデバッグ目的に使うものです。 よって、大規模な運用環境で使うべきではありません。

パラメータ

この関数にはパラメータはありません。

戻り値

成功した場合は全サーバーに格納されているキー、失敗した場合に false を返します。

add a note

User Contributed Notes 4 notes

up
6
flaviu dot chelaru at gmail dot com
8 years ago
// initiate the memcached instance$cache = new \Memcached();$cache->addServer('localhost', '11211');// get all stored memcached items$keys = $cache->getAllKeys();$cache->getDelayed($keys);$store = $cache->fetchAll();// delete by regex keys$keys = $cache->getAllKeys();$regex = 'product_.*';foreach($keys as $item) {    if(preg_match('/'.$regex.'/', $item)) {        $cache->delete($item);    }}
up
3
xiangku7890 at gmail dot com
9 years ago
First I use the lastest memcached version 1.4.25, but unfortunately I found memcached::getAllkeys do not work with it, though i follow the others suggestion to disable Memcached::OPT_BINARY_PROTOCOL. So i try to use history versions, when i use memcached version 1.4.17, it works.
up
1
danb1974 at gmail dot com
5 years ago
The right way to dump slab keys seems to be by using lru_crawler metadump instead of stats cachedump, see https://github.com/memcached/memcached/issues/405<?phpfunction getAllKeys(string $host, int $port): array{    $sock = fsockopen($host, $port, $errno, $errstr);    if ($sock === false) {        throw new Exception("Error connection to server {$host} on port {$port}: ({$errno}) {$errstr}");    }    if (fwrite($sock, "stats items\n") === false) {        throw new Exception("Error writing to socket");    }    $slabCounts = [];    while (($line = fgets($sock)) !== false) {        $line = trim($line);        if ($line === 'END') {            break;        }        // STAT items:8:number 3        if (preg_match('!^STAT items:(\d+):number (\d+)$!', $line, $matches)) {            $slabCounts[$matches[1]] = (int)$matches[2];        }    }    foreach ($slabCounts as $slabNr => $slabCount) {        if (fwrite($sock, "lru_crawler metadump {$slabNr}\n") === false) {            throw new Exception('Error writing to socket');        }        $count = 0;        while (($line = fgets($sock)) !== false) {            $line = trim($line);            if ($line === 'END') {                break;            }            // key=foobar exp=1596440293 la=1596439293 cas=8492 fetch=no cls=24 size=14908            if (preg_match('!^key=(\S+)!', $line, $matches)) {                $allKeys[] = $matches[1];                $count++;            }        }//        if ($count !== $slabCount) {//            throw new Exception("Surprise, got {$count} keys instead of {$slabCount} keys");//        }    }    if (fclose($sock) === false) {        throw new Exception('Error closing socket');    }        return $allKeys;}
up
1
harold at snel dot me
6 years ago
/** * Get all memcached keys. Special function because getAllKeys() is broken since memcached 1.4.23. Should only be needed on php 5.6 * * cleaned up version of code found on Stackoverflow.com by Maduka Jayalath * * @return array|int - all retrieved keys (or negative number on error) */public function getMemcachedKeys($host = '127.0.0.1', $port = 11211){    $mem = @fsockopen($host, $port);    if ($mem === false)    {        return -1;    }    // retrieve distinct slab    $r = @fwrite($mem, 'stats items' . chr(10));    if ($r === false)    {        return -2;    }    $slab = [];    while (($l = @fgets($mem, 1024)) !== false)    {        // finished?        $l = trim($l);        if ($l == 'END')         {            break;        }        $m = [];        // <STAT items:22:evicted_nonzero 0>        $r = preg_match('/^STAT\sitems\:(\d+)\:/', $l, $m);        if ($r != 1)         {            return -3;        }        $a_slab = $m[1];        if (!array_key_exists($a_slab, $slab))         {            $slab[$a_slab] = [];        }    }    reset($slab);    foreach ($slab as $a_slab_key => &$a_slab)    {        $r = @fwrite($mem, 'stats cachedump ' . $a_slab_key . ' 100' . chr(10));        if ($r === false)         {            return -4;        }        while (($l = @fgets($mem, 1024)) !== false)        {            // finished?            $l = trim($l);            if ($l == 'END')             {                break;            }            $m = [];            // ITEM 42 [118 b; 1354717302 s]            $r = preg_match('/^ITEM\s([^\s]+)\s/', $l, $m);            if ($r != 1)             {                return -5;            }            $a_key = $m[1];            $a_slab[] = $a_key;        }    }    // close the connection    @fclose($mem);    unset($mem);    $keys = [];    reset($slab);    foreach ($slab AS &$a_slab)    {        reset($a_slab);        foreach ($a_slab AS &$a_key)         {            $keys[] = $a_key;        }    }    unset($slab);    return $keys;}
To Top