在ZF2项目中启用Doctrine 2缓存

时间:2014-10-14 15:01:56

标签: php caching zend-framework doctrine-orm zend-framework2

如何在使用Zend Framework 2和Doctrine 2的项目中启用缓存?什么缓存应该启用doctrine缓存或zend缓存?

这里我尝试了但却看不出

中添加的执行时间有任何不同之处
  

模块\应用程序\配置\ module.config.php

 'doctrine.cache.my_memcache' => function ($sm) {
            $cache = new \Doctrine\Common\Cache\MemcacheCache();
            $memcache = new \Memcache();
            $memcache->connect('localhost', 11211);
            $cache->setMemcache($memcache);
        return $cache;
      }, 


    'doctrine.cache.apc' => function ($sm){
            $apc = new \Doctrine\Common\Cache\ApcCache();
            return $apc;
    },



    // Doctrine config
    'doctrine' => array(
        'driver' => array(
            __NAMESPACE__ . '_driver'   => array(
                'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
                'cache' => 'array',
                'paths' => array(__DIR__ . '/../src/' . __NAMESPACE__ . '/Entity'),
            ),
            'orm_default' => array(
                'drivers' => array(
                    __NAMESPACE__ . '\Entity' => __NAMESPACE__ . '_driver'
                ),
            )
        ),
        'configuration' => array(
            'orm_defaults' => array(
                'metadata_cache'    => 'apc',
                'query_cache'       => 'apc',
                'result_cache'      => 'my_memcache',
            )
        )
    ),

任何帮助或想法或解释表示赞赏。 感谢。

1 个答案:

答案 0 :(得分:8)

为减少不必要的麻烦,请始终在开发时使用array缓存,并在应用程序在生产环境中运行时使用memcachedredisapc

您应将工厂定义放在service_manager>下factories密钥,不直接在模块配置数组中。

module.config.php

中试试这个
return [
    'doctrine' => [
        'configuration' => [
            'orm_default' => [
                'metadata_cache' => 'mycache',
                'query_cache' => 'mycache',
                'result_cache' => 'mycache',
                'hydration_cache' => 'mycache',
            ]
        ],
    ],

    'service_manager' => [
        'factories' => [
            'doctrine.cache.mycache' => function ($sm) {
                $cache = new \Doctrine\Common\Cache\MemcacheCache();
                $memcache = new \Memcache();
                $memcache->connect('localhost', 11211);
                $cache->setMemcache($memcache);

                return $cache;
            },
        ],
    ],
];

此外,我强烈建议您始终将工厂搬到各个工厂类别。这样,在merged configuration cache的帮助下,您将在生产环境中拥有更具可读性,可维护性和高效率的应用程序。

例如:

'service_manager' => [
    'factories' => [
        'doctrine.cache.mycache' => \App\Memcache\Factory::class // implement FactoryInterface
        ],
    ],
];