Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/243.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php ZF2应用中的ORM缓存_Php_Caching_Doctrine Orm_Zend Framework2 - Fatal编程技术网

Php ZF2应用中的ORM缓存

Php ZF2应用中的ORM缓存,php,caching,doctrine-orm,zend-framework2,Php,Caching,Doctrine Orm,Zend Framework2,我在Zend Framework 2项目中使用了Doctrine 2 ORM,我想澄清一些关于缓存的细节 看起来像 return array( 'doctrine' => array( 'driver' => array( 'application_entities' => array( 'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDri

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

看起来像

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 console工具中只有3个选项可以清除缓存:

  • orm:清除缓存:元数据清除各种缓存驱动程序的所有元数据缓存
  • orm:清除缓存:查询清除各种缓存驱动程序的所有查询缓存
  • orm:清除缓存:结果清除各种缓存驱动程序的所有结果缓存
因此,考虑到rest缓存可以存储在不同的位置,而不一定存储在文件系统中,我如何清除rest缓存(尤其是实体缓存)


第二个问题:

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


**注意。*驱动程序配置的
chache
信息来自您描述的第一个缓存(实体缓存)实际上是元数据缓存,允许您覆盖在特定模块中的实体上使用的缓存类型, 因此,可以通过运行orm:clearcache:metadata来清除实体缓存

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

从文档中可以看出,在将实体合并回工作单元时使用水合缓存,考虑到这有多昂贵,应该避免使用水合缓存,但是如果使用水合缓存, 直觉告诉我们,通过运行orm:clearcache:result,您可以清除缓存

水合缓存:


将实体合并到UofW:

可能每次使用有关实体的条令命令行工具时,实体缓存都会刷新,并且每次请求后都会刷新实体缓存。问题是,实体和元数据缓存似乎相互冲突,仅清除其中一个是没有意义的,只有当两个缓存都被清除时,缓存才会被实际清除。我必须禁用实体缓存并使用rest缓存。从您所说的“实体缓存实际上是元数据缓存”来看,这似乎是真的,但这些缓存实际上是两个具有不同数据的独立缓存,我不明白它们是如何相互作用的。查询、结果和缓存实际上不是问题。