Versionen im Vergleich

Schlüssel

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

Die Cache-Komponente (Brandbox/Cache) implementiert PSR-6 für größtmögliche Interoperabilität. Hinter einer Fasade wird die Cache Component von Symfony verwendet. 

Info

Weiterlesen unter https://symfony.com/doc/current/components/cache.html

Folgende Caches stehen in brandbox zur Verfügung.

PHP (Object-Cache)

...

PSR-6 Caching

Der Cache-Provider

Der Cache-Provider ermöglicht die native Nutzung der Symfony Cache-Component und stellt ein einfaches Interface zur Verfügung, mit dem man den Cache validieren/invalidieren kann.

Codeblock
languagephp
themeRDark
titleBeispiel
use Brandbox\Framework\Brandbox\Cache;

$cache = Cache\Provider::get();
$callback = function () use ($something) {
  return 'cache-value';
};
$cacheTtl$cacheKeyArgs = [__METHOD__, '{cache-tag}'];
$lifetime = 86400; // 1 Tag
$namespace = 'brandbox/shop-core';

$html$result .= $cache->remember(
  [__METHOD__, '{cache-tag}'],
 $cacheKeyArgs, $callback,   $cacheTtl$lifetime,
  $namespace
);

Doctrine – Second-Level-Cache

Der Second-Level-Cache wird verwendet, wie hier beschrieben: https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/second-level-cache.html

Der Second-Level-Cache ist standardmäßig ausgeschaltet und muss in der config.php explizit aktiviert werden. Da die Verwendung des Second-Level-Cache ohne Redis Inkonsistenzen beim Betrieb mit mehreren Pods verursachen kann, muss er für die Verwendung mit APC explizit über einen weiteren Parameter aktiviert werden:

Codeblock
languagephp
themeRDark
titleconfig.php
/**
  * Cache
  */
  'cache' => [
    'doctrine' => true, // Second-Level-Cache einschalten
    'doctrine-apc' => true // Second-Level-Cache für die Verwendung mit APC einschalten
  ]

Wird der Second-Level-Cache genutzt, müssen Doctrine-Entities entsprechend gekennzeichnet werden:

Codeblock
languagephp
themeRDark
titleconfig.php
/**
* @Entity(repositoryClass="brandbox\my\repository\myEntity")
* @Cache(usage="NONSTRICT_READ_WRITE", region="brandbox")
* @Table(name="content_my_entity")
*
**/
class myEntity {

Connection

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

Repository

Hier wird der Cache für die Standard-Repositories und -Queries aktiviert: \Brandbox\Framework\Brandbox\Doctrine\Lib\Repository\RepositoryAbstract::createQueryBuilder

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:

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

Redis

Um Caches zentral zu verwalten, steht eine Schnittstelle zu Redis zur Verfügung. Redis wird in der config.php eingerichtet und dadurch aktiviert. Dieser wird benötigt, sofern mehr als ein Application-Container genutzt wird.Folgende Parameter werden in der Methode remember() angeboten:

  • $cacheKeyArgs = Dieses Array definiert die eindeutige Kennung dieses Cache-Eintrags. 
  • $callback = Eine Methode, die den zu cachenden Inhalt bereitstellt.
  • $lifetime = Gibt an wie lange der Cache erhalten bleiben soll
  • $namespace = Der Name der App in der der Cache aufgebaut wird

Cache-Parameter

Cache-Parameter können genutzt werden, um die $cacheKeyArgs objektorientiert bereitzustellen. Das hat Vorteile bei der Lesbarkeit und beim späteren, automatisierten invalidieren des Caches. Erstellen Sie zu dem Zweck einen Kontext abhängigen Parameter. 

Codeblock
languagephp
declare(strict_types=1);

use Brandbox\Framework\Brandbox\Cache;

class MyParameter extends Cache\Parameter
{
    public function __construct(string $tag)
    {
        $this->setParams([$tag]);
        $this->setMethod(__METHOD__);
    }
}

Dieser Parameter kann dann wie folgt genutzt werden:

Codeblock
languagephp
use Brandbox\Framework\Brandbox\Cache;

$parameter = new MyParameter('{cache-tag}');
$result = $cache->remember($parameter->get(), ...);

Laufzeitcache

Die Methode remember() cached auf zwei Arten. Der Lauzeitcache kann dabei exklusiv oder paralell zum Objekt-Cache betrieben werden. Um nur den Laufzeitcache zu nutzen, setzten Sie die Lifetime des Caches auf false. Der Laufzeitcache ermöglicht das Cachen von Inhalten, die nur zur Laufzeit des Requests gecached werden. 

PSR-6 Caching

Der Object-Cache ist aktiviert sobald die Lifetime >= 0 ist, wobei 0 für eine unendliche Gültikeit des Caches steht. In brandbox werden standardmäßig folgende Adapter genutzt: 

Apcu

Dieser Adapter ist immer aktiviert. Siehe https://symfony.com/doc/current/components/cache/adapters/apcu_adapter.html

Redis

Möchte man den Redis-Cache aktivieren, ist dafür ein laufender Redis-Server notwendig. Aktivieren Sie den dienst wie nachfolgend beschrieben.
Siehe https://symfony.com/doc/current/components/cache/adapters/redis_adapter.html

Codeblock
languagephp
themeRDark
titleconfig.php
/**
  * Redis
  */
  'redis' => [
 
  'host' => getenv('REDIS_HOST'),
 
  'port' => getenv('REDIS_PORT'),
 
]

...

Eventübersicht

KlassennameBeschreibung
OnFlushDatasetWird Cache\FlushDataset::class ausgelöst. Es steht damit eine zentrale Methode zur Verfügung, die es ermöglicht Datensatz-Caches zu leeren.

...