supprimer le cache par préfixe dans apc / memcache / eaccelerator
-
24-10-2019 - |
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?
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.
Il est un moyen de récupérer toutes les clés de memcache mais il est très cher.
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);
}
}