如果服务器脱机,如何告诉doctrine忽略Memcached?

时间:2016-03-08 15:55:02

标签: php symfony doctrine-orm doctrine memcached

我在Symfony2应用程序上测试Memcached 我将其设置为缓存doctrine的查询,结果和元数据:

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服务器发生故障,学说会如何表现。据我所知,应用程序中断了。在开发模式下,我收到以下消息:

  

注意:MemcachePool :: get():服务器localhost(tcp 11211,udp 0)失败:连接尝试失败,因为连接方在一段时间后没有正确响应,或者由于连接主机已经建立连接失败未能回应。   (10060)   500内部服务器错误 - ContextErrorException

在制作模式中,我也会看到一个http 500。

有没有办法告诉学说绕过/忽略Memcached服务器并直接转到数据库,而不是返回500?

1 个答案:

答案 0 :(得分:0)

您可以使用doctrine / orm 2.5

中提供的The Second Level Cache

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

保持orm的默认选项并将memcache添加为二级缓存的想法:

  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

启用后,将首先在缓存中搜索实体,如果找不到实体,则会触发数据库查询,然后实体结果将存储在缓存提供程序中。