为二级缓存提供Doctrine自定义缓存工厂

时间:2016-11-02 17:36:55

标签: symfony doctrine-orm doctrine second-level-cache

背景:我们正在使用Symfony 3.1 + Doctrine 2.5.5 + symfony doctrine bundle。

在尝试为我们的实体启用二级缓存时,我们遇到了以下问题。如果我们使用NONSTRICT_READ_WRITE,一切正常。但是,当我们尝试使用READ_WRITE时,我们收到以下错误 0)

Type error: Argument 2 passed to Doctrine\ORM\Cache\Persister\Entity\ReadWriteCachedEntityPersister::__construct() must be an instance of Doctrine\ORM\Cache\ConcurrentRegion, instance of Doctrine\ORM\Cache\Region\DefaultRegion given, called in vendor/doctrine/orm/lib/Doctrine/ORM/Cache/DefaultCacheFactory.php on line 133

据我所知,我们需要实际实现我们自己的ConcurrentRegion和CacheFactory版本才能使它工作(FileLockRegion不适合我们,因为它使用文件系统来处理缓存锁)。所以我编写了这些实现,但现在的主要问题在于:我找不到将自定义工厂类名称放在配置中的位置。我们在config中尝试了以下位置:

1)

doctrine:
    orm:
        auto_generate_proxy_classes: "%kernel.debug%"
        default_entity_manager:  master
        second_level_cache:
            default_cache_factory:
                class: AppBundle\Cache\MyCacheFactory

由于

而失败
Unrecognized option "second_level_cache" under "doctrine.orm"

即使在我们使用Symfony 2.8选项的其他项目中,“second_level_cache”也不会引发任何错误。

所以我们去了doctrine包代码并找到了以下节点描述(vendor / doctrine / doctrine-bundle / DependencyInjection / Configuration.php:492)

->arrayNode('second_level_cache')
                    ->children()
                        ->append($this->getOrmCacheDriverNode('region_cache_driver'))
                        ->scalarNode('region_lock_lifetime')->defaultValue(60)->end()
                        ->booleanNode('log_enabled')->defaultValue($this->debug)->end()
                        ->scalarNode('region_lifetime')->defaultValue(0)->end()
                        ->booleanNode('enabled')->defaultValue(true)->end()
                        ->scalarNode('factory')->end()
                    ->end()

所以我们决定在主实体管理器部分尝试这个配置: 2)

second_level_cache:
                region_cache_driver:
                    type: memcache
                enabled: true
                log_enabled: true
                factory: AppBundle\Cache\MyCacheFactory
                regions:
                    hour_region:
                        lifetime: 3600

但是,即使此配置被认为有效,当我们实际尝试使用已配置的缓存访问实体时,我们会收到错误0),这使我们认为doctrine / symfony正在忽略此选项。

有什么办法可以通过.yml配置来完成吗? Doctrine docs只建议实现CacheFactory并提供一个PHP代码示例,但即使我们决定放弃将我们的类放在.yml配置中并以PHP方式运行,它仍然不清楚这个PHP代码应该去哪里

1 个答案:

答案 0 :(得分:0)

使用类型-文件锁配置FilelockRegion

regions:
  default:
    cache_driver:
      type: service
      id: 'Doctrine\Common\Cache\RedisCache'
    lifetime: 3600
    type: filelock