Question

Supposons que j'ai ces variables enregistrées dans apc, memcached et eaccelerator:

  • article_1_0
  • article_1_1
  • article_3_2
  • article_3_3
  • article_2_4

Comment puis-je supprimer toutes les variables mises en cache qui commence par article_3_ (ils peuvent atteindre jusqu'à 10000)?

est-il possible de lister les variables mises en cache?

Était-ce utile?

La solution

La solution lente

Pour APC:

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

Pour eaccelerator:

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

Pour memcached, regardez la réponse @ rik

La bonne solution

La solution générale pour expirant plusieurs touches à la fois est de leur espace de noms. Pour eux venant à échéance, il vous suffit de changer l'espace de noms:

Disons que vous avez un groupe de touches « article_3_1 », « article_3_2 », .... Vous pouvez les stocker comme ceci:

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

les Fetch comme ceci:

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

Et les tout expireront juste en incrémentant l'espace de noms:

apc_inc('article_3_namespace');

Autres conseils

Bien que les documents disent APCIterator est disponible dans apc> = 3.1.1, je suis sur plusieurs systèmes qui prétendent avoir apc 3.1.9, mais il n'y a pas présent APCIterator. Si vous ne disposez pas APCIterator à votre disposition, donner quelque chose comme un tourbillon:

$aCacheInfo = apc_cache_info('user');

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

Dans cet exemple, nous vérifions pour un préfixe dans la clé, mais vous pouvez utiliser preg_match et. al et obtenir quelque chose de plus proche de ce APCIterator offre.

S'il y a possibilité d'utiliser d'autres moyens pour Memcached, SCACHE supports keyspaces structurés. Avec elle, vous pouvez stocker des données sur des chemins imbriqués:

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

et éventuellement détruire les données en supprimant le noeud parent

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

Il y a un APCIterator qui vous aide à rechercher dans les clés APC. Instancier le APCIterator.

APCIterator :: moyen valide () qu'il y a des touches encore creux itérer. APCIterator :: rendement clé () vous la touche apc. APCIterator :: next () déplace la position de l'itérateur à l'élément suivant.

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

Pour memcache vous pouvez utiliser Memcached et l'utilisation la méthode de getAllKeys

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