Domanda

Supponiamo che io ho queste variabili salvate in apc, memcached e eAccelerator:

  • article_1_0
  • article_1_1
  • article_3_2
  • article_3_3
  • article_2_4

Come faccio a eliminare tutte le variabili memorizzate nella cache che inizia con article_3_ (che può arrivare fino a 10000)?

esiste un modo per elencare le variabili memorizzate nella cache?

È stato utile?

Soluzione

La soluzione lenta

Per APC:

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

Per eaccelerator:

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

Per memcached, un'occhiata alla di @ rik risposta

La soluzione corretta

La soluzione generale per la scadenza più chiavi in ??una sola volta è quello di namespace loro. Per loro scadenza, devi solo cambiare lo spazio dei nomi:

Diciamo che avete un gruppo di tasti "article_3_1", "article_3_2", .... Si possono memorizzare in questo modo:

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

li Fetch in questo modo:

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

E tutti scade semplicemente incrementando il namespace:

apc_inc('article_3_namespace');

Altri suggerimenti

Anche se i documenti dicono APCIterator è disponibile in apc> = 3.1.1, io sono su diversi sistemi che sostengono di avere apc 3.1.9, tuttavia non v'è alcun APCIterator presente. Se non si dispone di APCIterator a vostra disposizione, dare qualcosa di simile un vortice:

$aCacheInfo = apc_cache_info('user');

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

In questo esempio stiamo controllando per un prefisso nella chiave, ma si potrebbe usare preg_match et. Al e ottenere qualcosa di più vicino a ciò che APCIterator fornisce.

Se non v'è possibilità di utilizzare alternative per memcached, Scache supporti keyspaces strutturati. Con esso è possibile memorizzare i dati per i percorsi nidificati:

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

e infine distruggere i dati eliminando il nodo principale

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

C'è un APCIterator che ti aiuta a cercare attraverso le chiavi di APC. Un'istanza della APCIterator.

APCIterator :: valido () significa che ci sono le chiavi ancora attraverso iterate. APCIterator :: chiave () restituisce la chiave apc. APCIterator :: next () sposta la posizione iteratore alla voce successiva.

// 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();
}

Per memcache è possibile utilizzare Memcached e l'uso getAllKeys metodo

// 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);
    }
}  
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top