将过程缓存清除迁移到PSR-6缓存池服务

时间:2016-09-28 16:39:10

标签: symfony caching doctrine-orm apc psr-6

到目前为止,我们的Doctrine实体通过LifecycleEvents进行了缓存清除。根据实体的id结合缓存密钥常量删除APCu缓存:

/**
 * @ORM\PostPersist()
 */
public function postPersist(LifecycleEventArgs $event)
{
    apc_delete(sprintf(selff::CACHE_KEY, $event->getEntity()->getId()));
}

这是可能的,因为程序性的apc方法,但这永远不会允许我们升级到PSR-6,因为它使用了应该作为服务注入的CacheItemPool

由于我们永远不会在实体中注入缓存池,我猜我们应该为超过一半的实体创建EventSubscriberEventListener。这可能的开销吓到了我一点。

订阅者/侦听者重组是否会增加很多开销,这是正确的方法吗?我们应该为处理所有事件的所有实体(1..n)添加一个全局侦听器/订阅者,还是为每个实体(n..m)添加一个侦听器/订阅者更好?

1 个答案:

答案 0 :(得分:0)

  
    

订阅者/监听者重组是否会增加很多开销,这是正确的方法吗?

  

postPersist方法也被添加为doctrine EventManager的监听器。 http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/events.html

基于此,我猜想不会有明显的开销。

但是,我不会根据这个做出决定,而是尝试一下。您可以使用Symfony探查器查看是否存在任何开销以及它有多大。 我用于这种比较的非常酷的服务是Blackfire.io。

  

我们应该为处理所有事件的所有实体(1..n)添加一个全局侦听器/订阅者,还是为每个实体(n..m)添加一个侦听器/订阅者更好?

我会为所有实体创建全局侦听器。如果您需要为任何特定实体使用不同的缓存逻辑,您始终可以创建单独的案例。