2014-11-05 119 views
3

plz我需要一些幫助,我已經goolged很多,但沒有結果:/ 我怎麼可以利用查詢和他們的結果存儲在memcache中,我正在與zend框架2和教義2工作?這裏是我在module.config.php中的配置:如何在doctrine 2和zend framework 2中使用緩存?

// Doctrine config 
    'doctrine' => array(
     'driver' => array(
      __NAMESPACE__ . '_driver' => array(
       'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver', 
       'paths' => array(__DIR__ . '/../src/' . __NAMESPACE__ . '/Entity') 
      ), 
      'orm_default' => array(
       'drivers' => array(
        __NAMESPACE__ . '\Entity' => __NAMESPACE__ . '_driver' 
       ), 
     ) 
      ), 
      /***** enabling the memcache ****/ 
      'configuration' => array(
       'orm_default' => array(
        'metadata_cache' => 'mycache', 
        'query_cache'  => 'mycache', 
        'result_cache'  => 'mycache', 

      ) 
      /**** end ****/ 
     ) 
    ), 

    'service_manager' => array(
     'factories' => array(
      'translator' => 'Zend\I18n\Translator\TranslatorServiceFactory', 
      'navigation' => 'Zend\Navigation\Service\DefaultNavigationFactory', 
      'doctrine.cache.mycache' => function ($sm) { 
       $cache = new \Doctrine\Common\Cache\MemcacheCache(); 
       $memcache = new \Memcache(); 
       $memcache->connect('localhost', 11211); 
       $cache->setMemcache($memcache); 
       return $cache; 
     }, 
     ), 
    ), 

任何想法或鏈接appeciated,謝謝。 此致敬禮。

+0

「mycache」是由您創建的自定義緩存嗎? – SenseException 2014-11-06 11:04:48

+0

不,我使用memcache來存儲查詢和結果的教義查詢,但我仍然可以使用它嗎?我正在尋找如何保存查詢以及如何獲取結果...... – user3911183 2014-11-07 08:58:45

+0

在您的示例的「啓用memcache」中,您正在使用mycache作爲3種緩存類型的Doctrine的值。這個mycache在你的代碼中做了什麼,它調用了哪些代碼? – SenseException 2014-11-07 09:39:08

回答

6

我想你正在使用DoctrineModule,對吧? 將您的配置更改爲:

// Doctrine config 
'doctrine' => array(
    'driver' => array(
     __NAMESPACE__ . '_driver' => array(
      'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver', 
      'paths' => array(__DIR__ . '/../src/' . __NAMESPACE__ . '/Entity') 
     ), 
     'orm_default' => array(
      'drivers' => array(
       __NAMESPACE__ . '\Entity' => __NAMESPACE__ . '_driver' 
      ), 
     ), 
    ), 
    /***** enabling the memcache ****/ 
    'configuration' => array(
     'orm_default' => array(
      'metadata_cache' => 'memcache', 
      'query_cache'  => 'memcache', 
      'result_cache'  => 'memcache', 
     ) 
    ), 
    /**** end ****/ 
    'cache' => array(
     'memcache' => array(
      'instance' => 'doctrine.cache.mycache', 
     ), 
    ), 
), 

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

這是如何工作的?

模塊配置是每個支持的緩存適配器including memcache的預定義配置。有了這個配置,你說「使用的memcache緩存」:

'configuration' => array(
    'orm_default' => array(
     'metadata_cache' => 'memcache', 
     'query_cache'  => 'memcache', 
     'result_cache'  => 'memcache', 
    ) 
), 

此配置的緩存需求的Memcache實例,這個配置說「內存緩存實例提供的ServiceManager與鍵‘doctrine.cache.mycache’」

'cache' => array(
    'memcache' => array(
     'instance' => 'doctrine.cache.mycache', 
    ), 
), 

更新:

如何使用結果緩存(documentation):

$cache = $entityManager->getConfiguration()->getResultCacheImpl(); 
$cacheItemKey = 'my-item'; 

// test if item exists in the cache 
if ($cache->contains($cacheItemKey)) { 
    $item = $cache->fetch($cacheItemKey); // retrieve item from cache 
} else { 
    $item = $repository->find($id); // retrieve item from repository 
    $cache->save($cacheItemKey, $item); // save item to cache 
} 
+0

感謝Iku的回答,我需要的是:如何啓用我的控制器中的緩存以獲得memcache的結果?我想我沒有解釋清楚我的問題。 – user3911183 2014-11-10 09:39:00

+0

@ user3911183好的,我更新了我的答案 – lku 2014-11-10 11:11:20

+0

@Iku,哦,你很棒:)非常感謝 – user3911183 2014-11-10 11:39:48