Как я могу запросить memcached с php, чтобы получить список всех его ключей в хранилище?


Мне нужно скопировать memcached в другую систему ключевых значений (couchbase). Как я могу запросить содержимое сервера memcached, чтобы получить список того, что там находится, чтобы я мог скопировать его?

3 8

3 ответа:

Memcache >= 2.0.0

function getMemcacheKeys() {
    $memcache = new Memcache;
    $memcache->connect('127.0.0.1', 11211) 
       or die ("Could not connect to memcache server");

    $list = array();
    $allSlabs = $memcache->getExtendedStats('slabs');
    $items = $memcache->getExtendedStats('items');
    foreach($allSlabs as $server => $slabs) {
        foreach($slabs AS $slabId => $slabMeta) {
            $cdump = $memcache->getExtendedStats('cachedump',(int)$slabId);
            foreach($cdump AS $keys => $arrVal) {
                if (!is_array($arrVal)) continue;
                foreach($arrVal AS $k => $v) {                   
                    echo $k .'<br>';
                }
            }
        }
    }   
} 

Все эти решения для Memcache так вот для Memcached

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 = array();
    while (($l = @fgets($mem, 1024)) !== FALSE) {
        // sortie ?
        $l = trim($l);
        if ($l == 'END') break;

        $m = array();
        // <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] = array();
    }

    // recuperer les items
    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) {
            // sortie ?
            $l = trim($l);
            if ($l == 'END') break;

            $m = array();
            // 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
    @fclose($mem);
    unset($mem);

    // transform it;
    $keys = array();
    reset($slab);
    foreach ($slab AS &$a_slab) {
        reset($a_slab);
        foreach ($a_slab AS &$a_key) $keys[] = $a_key;
    }
    unset($slab);

    return $keys;
}

Спасибо за пример кода

Вот как удалить определенный ключ или несколько ключей

Я использую вспомогательный класс для удаления кэша, поэтому вы должны дать функции ссылку на соединение memcache

public static function removePriceCache(&$memcache, &$cacheAvailable) {

    if ($cacheAvailable == true) {
        $list = array();
        $allSlabs = $memcache->getExtendedStats('slabs');
        $items = $memcache->getExtendedStats('items');
        foreach ($allSlabs as $server => $slabs) {
            foreach ($slabs AS $slabId => $slabMeta) {
                $cdump = $memcache->getExtendedStats('cachedump', (int) $slabId);
                foreach ($cdump AS $keys => $arrVal) {
                    if (!is_array($arrVal))
                        continue;
                    foreach ($arrVal as $k => $v) {
                        //echo $k . '<br>';

                        if (stripos($k, "Price") !== false) {
                            $memcache->delete($k);
                        }
                    }
                }
            }
        }
    }
}

Это приведет к удалению всех ключей, в которых есть слово "цена"..