ZF2应用程序中的Doctrine ORM缓存

时间:2015-06-04 21:05:17

标签: php caching doctrine-orm zend-framework2

我在Zend Framework 2项目中使用Doctrine 2 ORM,我想澄清一些有关缓存的细节。

Doctrine配置看起来像

return array(
    'doctrine' => array(
        'driver' => array(
            'application_entities' => array(
                'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
                'cache' => 'doctrine_cache_entities', // 1
                'paths' => array(__DIR__ . '/../src/Application/Entity')
            ),
            'orm_default' => array(
                'drivers' => array(
                    'Application\Entity' => 'application_entities',
                ),
            ),
        ),
        'configuration' => array(
            'orm_default' => array(
                'metadata_cache' => 'doctrine_cache_metadata', // 2
                'query_cache' => 'doctrine_cache_query', // 3
                'result_cache' => 'doctrine_cache_result', // 4
                'hydration_cache' => 'doctrine_cache_hydration', // 5
            )
        ),
    ),
);

这里我们可以看到5种不同类型的缓存:

  • 实体缓存
  • 元数据缓存
  • 查询缓存
  • 结果缓存
  • 水合缓存

但Doctrine控制台工具中只有3个选项可以清除缓存:

  • orm:clear-cache:metadata清除各种缓存驱动程序的所有元数据缓存。
  • orm:clear-cache:query清除各种缓存驱动程序的所有查询缓存。
  • orm:clear-cache:result清除各种缓存驱动程序的所有结果缓存。

那么我怎样才能清除其余的缓存(特别是实体缓存),因为它可以存储在不同的地方,不一定存储在文件系统中。

第二个问题:

是否应该同时在生产中启用所有这些缓存(问题主要是实体和元数据缓存,因为它们似乎包含类似的数据)?

** N.B. *驱动程序配置的chache信息来自here

1 个答案:

答案 0 :(得分:1)

您描述的第一个缓存(实体缓存)实际上是元数据缓存,允许您覆盖在paticulate模块中实体上使用的缓存类型, 因此,您可以通过运行orm来清除实体缓存:clear-cache:metadata。

使用水合缓存,我倾向于说它链接到结果缓存。

从文档中,当将实体合并回工作单元时使用水合缓存,并且考虑到它的成本有多高,应该避免使用,但是如果你要使用水合缓存, 直觉会建议通过运行orm:clear-cache:result来清除水合缓存。

水合缓存:https://groups.google.com/forum/#!topic/doctrine-user/V4G4rRF7Ls4

将实体合并到UofW:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/working-with-objects.html#merging-entities