2015-08-29 19 views
5

dopo aver investito alcuni giorni a capire perché la mia configurazione di cache di secondo livello per la dottrina non funziona, spero che qualcuno possa essere in grado di supportare. Al momento nessuna chiamata alla cache di secondo livello risulta in un successo.Doctrine Second Level Cache w/Redis

Il mio progetto è attualmente impostato con i seguenti pacchetti (+ qualche altro che non sono probabilmente rilevanti per questa configurazione):

"symfony/symfony": "2.6.*", 
"doctrine/orm": "2.*", 
"doctrine/dbal": "2.*", 
"doctrine/doctrine-bundle": "~1.2" 
... 
"snc/redis-bundle": "1.*" 

La cache dottrina è configurato come segue:

orm: 
    auto_generate_proxy_classes: "%kernel.debug%" 
    auto_mapping: true 
    metadata_cache_driver: redis 
    query_cache_driver:  redis 
    result_cache_driver: redis 
    second_level_cache: 
     enabled:   true 
     log_enabled:  true 

La cache delle query dei metadati & sembra funzionare correttamente, in quanto vi sono chiavi create all'interno di Redis e il pacchetto SNC Redis registra correttamente anche i riscontri della cache. Ma la "Cache 2l" solo registra miss e mette, invece di risultati:

no 2l cache hits

Durante il mio debug, ho scoperto che all'interno delle richieste di cache di Dottrina/ORM/Query tenta di accedere al ArrayCache invece del driver di cache configurato.

Potrebbe già essere d'aiuto se qualcuno ha una configurazione di esempio di lavoro per la cache di secondo livello in quanto non funziona con Redis per me, né per APCu o memcached.

Spero che qualcuno abbia un'idea o possa semplicemente condividere la sua configurazione di lavoro.

Grazie in anticipo & migliori saluti

+0

Sembra come non si sa come utilizzare SncRedisBundle con la dottrina di cache di secondo livello, se possibile a tutti pari. –

risposta

5

Ok così finalmente ho avuto la risposta a questo dopo circa un mese!

Si noti che Doctrine supporta nativamente molti driver di cache compresi i redis ma, nel mio caso, probabilmente anche nel caso dell'OP, avevo bisogno di farlo funzionare con SncRedisBundle in modo da sfruttare la replica Redis Master-Slave e/o Clustering.

ho avuto la mia risposta con un feedback utile su Github qui https://github.com/snc/SncRedisBundle/issues/216

In sostanza, è necessario creare un servizio che è fondamentalmente un paio di righe di codice in services.yml

.... 
services: 
    snc_second_level_cache: 
     class: %snc_redis.doctrine_cache.class% 
     calls: 
      - ["setRedis", ["@snc_redis.cache"]] 
      - ["setNamespace", ["DoctrineSecondLevelCache"]] #Optional 
.... 

poi nella vostra configurazione. yml

.... 
orm: 
    entity_managers: 
     default: 
      second_level_cache: 
       region_cache_driver: 
        type: service 
        id: snc_second_level_cache 
       enabled: true 
.... 

Ecco, buon divertimento!

AGGIORNAMENTO - 19 gennaio 2016

A partire da oggi, SncRedisBundle ramo dev-master è ora compatibile e viene fornito con supporto integrato per dottrina secondo livello cache

+0

Puoi condividere un esempio funzionante dell'integrazione di SncRedisBundle con Doctrine Second Level Cache? Grazie! – LaurentG

1

È inoltre necessario consentire la corretta cache_driver per il secondo livello di cache di:

second_level_cache: 
     region_cache_driver: 
      type:     service 
      id:     doctrine_cache.providers.second_level 
     enabled:    true 
     regions: 
      region_name: 
       cache_driver: 
        type:     service 
        id:     doctrine_cache.providers.second_level 

Questo è un esempio in combinazione con DoctrineCacheBundle.