Как я могу запросить memcached с php, чтобы получить список всех его ключей в хранилище?
Мне нужно скопировать memcached в другую систему ключевых значений (couchbase). Как я могу запросить содержимое сервера memcached, чтобы получить список того, что там находится, чтобы я мог скопировать его?
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); } } } } } } }
Это приведет к удалению всех ключей, в которых есть слово "цена"..