如果服务器离线,如何告诉学说忽略 Memcached?

ohv*_*ino 5 php memcached doctrine symfony doctrine-orm

我正在我的 Symfony2 应用程序上测试 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]]
Run Code Online (Sandbox Code Playgroud)

到目前为止,一切正常。

我想知道如果 Memcached 服务器出现故障,学说会如何表现。据我所知,应用程序中断了。在开发模式下,我收到以下消息:

注意: MemcachePool::get(): Server localhost (tcp 11211, udp 0) failed with: 连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立连接失败,因为连接的主机没有响应. (10060) 500 内部服务器错误 - ContextErrorException

在生产模式下,我还会看到一个 http 500。

有没有办法告诉教义绕过/忽略 Memcached 服务器并直接进入数据库,而不是返回 500s?

sad*_*k-f 0

您可以使用The Second Level Cache在doctrine/orm 2.5中可用的

请参阅: 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
Run Code Online (Sandbox Code Playgroud)

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