Doctrine2缓存更新的元素

And*_*erj 5 caching doctrine-orm

我的学说有问题.我喜欢缓存,但是如果我更新实体并刷新,那么doctrine2是否应该能够清除它的缓存?否则缓存对我来说用处很少,因为这个项目有很多交互,我总是要为每个查询禁用缓存.如果缓存总是向他们显示旧的缓存版本,则用户将看不到他们的交互.

它有什么方法吗?

Goh*_*n67 1

这是根据 Doctrine2 上关于如何清除缓存的文档。我什至不确定这是否是您想要的,但我想这是值得尝试的事情。

Doctrine2 的缓存驱动程序具有不同级别的删除缓存条目的功能。

您可以通过直接 ID、使用正则表达式、后缀、前缀和普通删除缓存中的所有值来删除

所以要删除你要做的一切:

$deleted = $cacheDriver->deleteAll();
Run Code Online (Sandbox Code Playgroud)

要按前缀删除,您可以这样做:

$deleted = $cacheDriver->deleteByPrefix('users_');
Run Code Online (Sandbox Code Playgroud)

我不确定 Doctrine2 如何命名它们的缓存 ID,所以你必须挖掘它。

有关删除缓存的信息可在此处找到:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/caching.html#deleting

要获取缓存驱动程序,您可以执行以下操作。文档中没有描述它,所以我只是稍微跟踪一下代码。

我假设您在此示例中有一个实体管理器实例:

$config = $em->getConfiguration(); //Get an instance of the configuration
$queryCacheDriver = $config->getQueryCacheImpl(); //Gets Query Cache Driver
$metadataCacheDriver = $config->getMetadataCacheImpl(); //You probably don't need this one unless the schema changed
Run Code Online (Sandbox Code Playgroud)

或者,我想您可以将cacheDriver实例保存在某种Registry类中并以这种方式检索它。但取决于您的喜好。就我个人而言,我尽量不要过度依赖注册表。

您可以做的另一件事是告诉您正在执行的查询不使用结果缓存。我再次认为这不是你想要的,但只是把它扔在那里。主要是您似乎最好完全关闭查询缓存。除非只是一些您不想使用缓存的特定查询。

此示例来自文档:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/caching.html#result-cache

$query = $em->createQuery('select u from \Entities\User u');
$query->useResultCache(false); //Don't use query cache on this query
$results = $query->getResult();
Run Code Online (Sandbox Code Playgroud)