使用Doctrine Entity Manager缓存SELECT查询

时间:2014-08-07 14:35:27

标签: php symfony caching doctrine-orm doctrine

我在代码中多次使用Doctrine Entity Manager,我以这种方式使用了例如:

$em = $this->getDoctrine()->getManager();
$countries = $em->getRepository('CommonBundle:Country')->findAll();

可以使用这种格式的Doctrine Cache吗?我看到很多文档,但它们都与Doctrine Query Builder有关,有什么建议吗?如何为SELECT查询启用缓存?

缓存不起作用(艰难)

我正在处理缓存结果,我这样做是为了缓存一些查询:

  • orm的{​​{1}}配置下启用APC:

    config.yml
  • 将存储库附加到我的实体:

    doctrine:
        dbal:
            driver:   "%database_driver%"
            host:     "%database_host%"
            port:     "%database_port%"
            dbname:   "%database_name%"
            user:     "%database_user%"
            password: "%database_password%"
            charset:  UTF8
        orm:
            auto_generate_proxy_classes: "%kernel.debug%"
            auto_mapping: true
            metadata_cache_driver: apc
            result_cache_driver: apc
            query_cache_driver: apc
    
  • 在存储库类中编写一个方法来获取数据并缓存结果:

    /**
     * @ORM\Entity(repositoryClass="CommonBundle\Entity\Repository\CountryRepository")
     */
    class Country {
        ....
    

但是每当我重新加载页面时,查询都会按照分析器中的显示执行(见下图):

enter image description here

我做错了什么?缓存只适用于生产或也适用于开发?不应该获得缓存结果而不是一次查询数据库吗?

2 个答案:

答案 0 :(得分:1)

您必须在symfony配置中为结果启用缓存:

doctrine:
    orm:        
        metadata_cache_driver: apc # or memcache
        result_cache_driver: apc   # or memcache
        query_cache_driver: apc    # or memcache

然后在每个需要缓存的请求上,调用

$query->useResultCache(true)

此处提供了更多高级选项:http://docs.doctrine-project.org/en/2.0.x/reference/caching.html#result-cache

答案 1 :(得分:1)

EntityRepository API不允许使用find * methods启用ResultCache。

您必须使用QueryBuilder和/或DQL请求。

我写了一篇关于Doctrine缓存的文章,也许它可以帮到你:http://blog.alterphp.com/2014/05/doctrine2-optimization-with-apc-cache.html