Versionen im Vergleich

Schlüssel

  • Diese Zeile wurde hinzugefügt.
  • Diese Zeile wurde entfernt.
  • Formatierung wurde geändert.

...

Codeblock
languagephp
'cache' => [
    '2nd-lc' => [
        'active' => true,
        'logger' => false,
        'lifetime' => 24 * 60 * 60 // = 24h
    ]
]

Definition im Entity

Das Entity erhält weitere Informationen über den Umgang des Caches mit diesem Entity.

Codeblock
languagephp
use Doctrine\ORM\Mapping\Cache;

/**
 * @Entity
 * @Cache(usage="NONSTRICT_READ_WRITE", region="brandbox/app-xyz")
 * ...
 **/
class Entity ... {
}

Umgang mit unterschiedlichen Datensatz-Arten

Je nach Zweck sollte ein Entity in den Cache oder nicht. Es gibt folgende Möglichkeiten:

Nicht in den Cache

Datensätze die nur einmal geschrieben werden und extrem selten abgerufen werden, gehören nicht in den Cache. Zur Verwendung wird die Cache-Class nicht, wie im obigen Beispiel, in das Entity aufgenommen.
Beispiel: Logs 

...

Das ist der häufigste und übliche Fall.

Connection

In der Connection wird der Cache aktiviert: \Brandbox\Framework\Brandbox\Doctrine\Lib\Connection\Connection::enableSecondLevelCache

Cacheable oder nicht

Ein Query ist Cacheable wenn ein Entity im Result ausgeliefert wird. Ist das nicht der Fall, kommt es zum Fehler (WSOD). Man erkennt das an der Hydration.
Letztlich ist „nur“ dieses Objekt cacheable: \Doctrine\ORM\AbstractQuery::HYDRATE_OBJECT

Evict

Wird ein Datensatz verändert (DELETE, INSERT, UPDATE) muss der verändernde Query ein Hint erhalten:

Beispiel
Codeblock
languagephp
$qb
  ->delete($class, $identifier)
  ->where($expr->eq($identifier . '.id', ':id'))
  ->setParameter(':id', $id)
  ->getQuery()
  ->setHint(ORM\Query::HINT_CACHE_EVICT, true)
  ->execute()
;