到目前为止,我们的Doctrine实体通过LifecycleEvents
进行了缓存清除。根据实体的id结合缓存密钥常量删除APCu缓存:
/**
* @ORM\PostPersist()
*/
public function postPersist(LifecycleEventArgs $event)
{
apc_delete(sprintf(selff::CACHE_KEY, $event->getEntity()->getId()));
}
这是可能的,因为程序性的apc方法,但这永远不会允许我们升级到PSR-6,因为它使用了应该作为服务注入的CacheItemPool
。
由于我们永远不会在实体中注入缓存池,我猜我们应该为超过一半的实体创建EventSubscriber
或EventListener
。这可能的开销吓到了我一点。
订阅者/侦听者重组是否会增加很多开销,这是正确的方法吗?我们应该为处理所有事件的所有实体(1..n)添加一个全局侦听器/订阅者,还是为每个实体(n..m)添加一个侦听器/订阅者更好?
答案 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)添加一个侦听器/订阅者更好?
我会为所有实体创建全局侦听器。如果您需要为任何特定实体使用不同的缓存逻辑,您始终可以创建单独的案例。