在apc/memcache/eaccelerator中按前缀删除缓存

Ron*_*ero 4 php memcached eaccelerator apc

假设我将这些变量保存在apc,memcached和eaccelerator中:

  • article_1_0
  • article_1_1
  • article_3_2
  • article_3_3
  • article_2_4

如何删除所有以article_3_(最多可达10000)的缓存变量?

有没有办法列出缓存变量?

Arn*_*anc 11

缓慢的解决方案

对于APC:

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

对于eaccelerator:

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

对于memcached,请查看@ rik的答案

适当的解决方案

一次过期多个密钥的一般解决方案是命名它们.要使它们过期,您只需更改命名空间:

假设您有一组键"article_3_1","article_3_2",....您可以像这样存储它们:

$ns = apc_fetch('article_3_namespace');
apc_store($ns."_article_3_1", $value);
apc_store($ns."_article_3_2", $value);
Run Code Online (Sandbox Code Playgroud)

像这样获取它们:

$ns = apc_fetch('article_3_namespace');
apc_fetch($ns."_article_3_1");
Run Code Online (Sandbox Code Playgroud)

只需递增命名空间即可使它们全部到期:

apc_inc('article_3_namespace');
Run Code Online (Sandbox Code Playgroud)

  • APCIterator为+1,但确实需要APC 3.1.1或更高版本 (3认同)