drg5577 2017-12-19 10:41
浏览 76

如何通过标签清除Symfony apcu缓存

I set cache item and this works well

$cache = new ApcuAdapter('my_namespace', 3600, '2');
$cacheItem = $cache->getItem('cache_item_id');
if (!$cacheItem->isHit()) {
    $cacheData = $someClass->getDataForCache();
    $cacheItem->set($cacheData);
    $cacheItem->tag('test_tag');
    $cache->save($cacheItem);
}

But clear cache by tag not working (Symfony cache component - Cache Invalidation)

$cache = new TagAwareAdapter(new ApcuAdapter('cache_item_id'));
$invalidate = $cache->invalidateTags(['test_tag']); // true

That is

$cacheItem->isHit() // true

What am I doing wrong?

  • 写回答

1条回答 默认 最新

  • dowdw44426 2018-06-14 07:57
    关注

    When wrapping the ApcuAdapter with TagAwareAdapter you're setting the namespace to a different one ("cache_item_id") than originally set ("my_namespace"). This would result in invalidating tags in a different namespace.

    Also and more importantly, you need to save the item using the tag aware adapter.

    $cache = new \Symfony\Component\Cache\Adapter\ApcuAdapter('my_namespace');
    $tagAwareCache = new \Symfony\Component\Cache\Adapter\TagAwareAdapter($cache);
    
    $cacheItem = $tagAwareCache->getItem('cache_item_id');
    
    if (!$cacheItem->isHit()) {
        $cacheItem->set($someClass->getDataForCache());
        $cacheItem->tag('test_tag');
        $tagAwareCache->save($cacheItem);
    }
    
    $cacheItem = $tagAwareCache->getItem('cache_item_id');
    
    var_dump($cacheItem->isHit()); // true
    
    $tagAwareCache->invalidateTags(['test_tag']);
    
    $cacheItem = $tagAwareCache->getItem('cache_item_id');
    
    var_dump($cacheItem->isHit()); // false
    
    评论

报告相同问题?