la cache di eliminazione dal prefisso apc / memcache / eAccelerator
-
24-10-2019 - |
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?
Soluzione
La soluzione lenta ??h3>
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 ??h3>
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.
un modo per recuperare tutte le chiavi da memcache ma è molto costoso.
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);
}
}