2012-03-22 13 views

Respuesta

11

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>'; 
       } 
      } 
     } 
    } 
} 
+2

sólo quiero señalar aquí que, si bien esto funciona cachedump es realmente está destinado a fines de depuración de memcached y no está destinado a ser utilizado de esta manera. Las versiones futuras de memcached también podrían no ser compatibles con cachedump. (Vea el comentario 8 aquí de uno de los principales contribuidores memcached http://code.google.com/p/memcached/issues/detail?id=187) – mikewied

+1

Cachedump no parece obtener todas las claves (he estado tratando de hacer esto, y luego encontré este enlace): http://code.google.com/p/memcached/wiki/NewProgrammingFAQ – jonderry

+0

una pequeña pero gran diferencia que funcionó para mí fue el parámetro ** limit ** en ' Función getExtendedStats', el valor predeterminado es _just_100. update: '$ cdump = $ memcache-> getExtendedStats ('cachedump', (int) $ slabId, 100000000);' – matija

0

Gracias por el código de ejemplo

Aquí es cómo quitar una tecla específica o varias claves

estoy usando una clase de ayuda para eliminar el caché por lo que debe asignarle a la función una referencia a la conexión de 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); 
         } 
        } 
       } 
      } 
     } 
    } 
} 

Esto eliminará todas las teclas que tienen la palabra 'precio' en ella ..

6

Todas estas soluciones para Memcache así que aquí está para 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; 
} 
+1

Esta es la mejor respuesta actualmente aunque las personas aún no la hayan votado; la pregunta que asker estaba haciendo sobre Memcached con una 'd'. No sé por qué la respuesta de Mark Baker recibió tantos votos a favor. – Ryan

+1

Esta es la respuesta correcta. – Apollo

+1

De acuerdo, la mejor respuesta. – HakRo

Cuestiones relacionadas