2016-03-08 89 views
4

我測試我的Symfony2應用 了Memcached我將它設置爲緩存主義的查詢,結果和元數據:如何讓服務器脫機時忽略Memcached的原則?

orm: 
    entity_managers: 
     default: 
      metadata_cache_driver: 
       type: service 
       id: doctrine.cache.memcache2 
      query_cache_driver: 
       type: service 
       id: doctrine.cache.memcache2 
      result_cache_driver: 
       type: service 
       id: doctrine.cache.memcache2 

services: 
    memcache: 
     class: Memcache 
     calls: 
      - [ addserver, [ 'localhost', 11211 ]] 

    doctrine.cache.memcache2: 
     class: Doctrine\Common\Cache\MemcacheCache 
     calls: 
      - [setMemcache, [@memcache]] 

到現在爲止,一切工作正常。

我想知道如果Memcached服務器出現故障,doctrine的行爲如何。據我所知,應用程序中斷。在開發模式我得到以下信息:

聲明:MemcachePool ::得到():服務器localhost(TCP 11211,UDP 0)失敗:連接嘗試失敗,因爲連接的方沒有正確後響應一段時間,或建立的連接失敗,因爲連接的主機未能響應。 (10060) 500內部服務器錯誤 - ContextErrorException

在生產模式,我還帶有一個HTTP 500

有沒有辦法告訴學說繞過/忽略Memcached的服務器和去直接到數據庫,而不是返回500s?

回答

0

您可以使用學說提供The Second Level Cache/ORM 2.5

見: http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/second-level-cache.html

的想法,讓你默認選項ORM並添加一個內存緩存作爲二級緩存:

orm: 
    entity_managers: 
     default: 
      auto_mapping: true 
      second_level_cache: 
       region_cache_driver: 
        type:     service 
        id:     doctrine.cache.memcache2 
       enabled:    true 
       regions: 
        region_name: 
         cache_driver: 
          type:     service 
          id:     doctrine.cache.memcache2 

打開時,實體將首先在緩存中搜索,如果未找到,則會觸發數據庫查詢,然後將實體結果存儲在緩存提供程序中。

+0

我測試了您的解決方案,雖然看起來不錯,但我無法看到使用Memcache服務器的應用程序......在開發模式下是否使用了二級緩存?是否有必要在實體的@Cache註釋中指定區域「region_name」作爲我的區域? – ohvitorino

+0

我得到了二級緩存的工作。但行爲是一樣的。 Memcached被殺的那一刻,請求返回500。 – ohvitorino