2015-08-29 15 views
5

Nachdem ich einige Tage investiert habe, um herauszufinden, warum meine Second-Level-Cache-Konfiguration für die Doktrin nicht funktioniert, hoffe ich, dass jemand in der Lage sein wird, sie zu unterstützen. Im Moment führt kein Cache-Aufruf der zweiten Ebene zu einem Treffer.Doctrine Second Level Cache mit Redis

ist mein Projekt zur Zeit mit folgenden Paketen (+ einige andere, die sind wahrscheinlich nicht relevant für dieses Setup) einzurichten:

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

Die Lehre Cache eingerichtet ist, auf folgende Weise:

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 

Die Metadaten & Abfrage-Cache scheint ordnungsgemäß zu funktionieren, da in Redis Schlüssel erstellt wurden und das SNC Redis Bundle auch meine Cache-Treffer ordnungsgemäß protokolliert. Aber die „2l Cache“ meldet sich nur verfehlt und Puts, statt Treffer:

no 2l cache hits

Während meiner Debugging, fand ich heraus, dass innerhalb der Cache-Anfragen aus dem Buch Lehre/ORM/Abfrage versuchen, die ArrayCache stattdessen zugreifen des konfigurierten Cache-Treibers.

Es kann schon hilfreich sein, wenn jemand eine funktionierende Beispielkonfiguration für den Cache der zweiten Ebene hat, da es weder mit Redis für mich noch für APCu oder memcached funktioniert.

Ich hoffe, jemand hat eine Idee oder kann nur seine funktionierende Konfiguration teilen.

Vielen Dank im Voraus & freundliche Grüßen

+0

Scheint, wie niemand weiß, wie SncRedisBundle zu verwenden, um mit Lehre Second Level Cache, wenn überhaupt überhaupt möglich. –

Antwort

5

Ok, also habe ich nach ungefähr einem Monat endlich die Antwort darauf bekommen!

Bitte beachten Sie, dass Doctrine native Unterstützung für viele Cache-Treiber einschließlich redis bietet, aber in meinem Fall wahrscheinlich auch im OP, musste ich es mit SncRedisBundle arbeiten lassen, um die Redis Master-Slave-Replikation zu nutzen und/oder Clustering.

bekam ich meine Antwort mit hilfreichem Feedback auf Github hier https://github.com/snc/SncRedisBundle/issues/216

Grundsätzlich Sie einen Dienst erstellen muß, die

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

dann in der Config im Grunde ein paar Zeilen Code in services.yml ist. yml

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

Das ist es, viel Spaß!

UPDATE - 19. Januar 2016

Ab heute ist SncRedisBundle dev-Master-Zweig jetzt kompatibel und kommt mit integrierten Unterstützung für Lehre Second Level Cache

+0

Können Sie ein funktionierendes Beispiel für die Integration von SncRedisBundle mit Doctrine Second Level Cache teilen? Danke! – LaurentG

1

Sie müssen auch die richtigen cache_driver für den zweiten Level-Cache aktivieren:

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 

dies ein Beispiel in Verbindung mit DoctrineCacheBundle ist.