Pregunta

Supongamos que tengo estas variables guardadas en APC, Memcached y Eaccelerator:

  • article_1_0
  • article_1_1
  • article_3_2
  • article_3_3
  • article_2_4

¿Cómo puedo eliminar todas las variables almacenadas en caché que comienzan con article_3_ (pueden llegar hasta 10000)?

¿Hay alguna forma de enumerar las variables en caché?

¿Fue útil?

Solución

La solución lenta

Para APC:

$iterator = new APCIterator('user', '#^article_3_#', APC_ITER_KEY);
foreach($iterator as $entry_name) {
    apc_delete($entry_name);
}

Para Eaccelerator:

foreach(eaccelerator_list_keys() as $name => $infos) {
    if (preg_match('#^article_3_#', $name)) {
        eaccelerator_rm($name);
    }
}

Para Memcached, mira La respuesta de @Rik

La solución adecuada

La solución general para expirar múltiples claves a la vez es el espacio de nombres. Para expirarlos, solo tiene que cambiar el espacio de nombres:

Digamos que tiene un grupo de claves "Artículo_3_1", "Artículo_3_2", ... puede almacenarlas así:

$ns = apc_fetch('article_3_namespace');
apc_store($ns."_article_3_1", $value);
apc_store($ns."_article_3_2", $value);

Buscarlos así:

$ns = apc_fetch('article_3_namespace');
apc_fetch($ns."_article_3_1");

Y expirarlos a todos simplemente incrementando el espacio de nombres:

apc_inc('article_3_namespace');

Otros consejos

Aunque los documentos dicen que Apciterator está disponible en APC> = 3.1.1, estoy en varios sistemas que afirman tener APC 3.1.9, sin embargo, no hay APCiterator presente. Si no tiene apciterator a su disposición, dale un giro a algo así:

$aCacheInfo = apc_cache_info('user');

foreach($aCacheInfo['cache_list'] as $_aCacheInfo)
    if(strpos($_aCacheInfo['info'], 'key_prefix:') === 0)
        apc_delete($_aCacheInfo['info']);

En este ejemplo, estamos revisando un prefijo en la clave, pero podría usar PreG_Match ET. Al y lograr algo más cercano a lo que proporciona Apciterator.

Si existe la posibilidad de usar alternativas para Memcached, scache Admite espacios de teclas estructurados. Con él podría almacenar datos en rutas anidadas:

scache_shset($conn, 'article/1/0', $data10);
scache_shset($conn, 'article/3/0', $data30);
scache_shset($conn, 'article/3/1', $data31);

y finalmente destruir datos eliminando el nodo principal

scache_shunset($conn, 'article/3');

Hay un apciterator que lo ayuda a buscar a través de las claves en APC. Instanciar el apciterator.

Apciterator :: válido () significa que todavía hay claves para iterar el canal. Apciterator :: key () le devuelve la tecla APC. Apciterator :: next () mueve la posición de iterador al siguiente elemento.

// APC
$iterator = new APCIterator('user', '/^article_3_/');

while($iterator->valid()) {
     apc_delete($iterator->key());
     // You can view the info for this APC cache value and so on by using 
     // $iterator->current() which is array
     $iterator->next();
}

Para Memcache puedes usar Memcached y use Getallkeys método

// Memcached 
$m = new Memcached();
$m->addServer('mem1.domain.com', 11211);

$items = $m->getAllKeys();

foreach($items as $item) {
    if(preg_match('#^article_3_#', $item)) {
        $m->delete($item);
    }
}  
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top