Cache

Das SetaFramework verwendet als Cache Lösung momentan  phpfastcache/phpfastcache, jedoch sind sämtliche Abhängigkeiten lediglich zu PSR16 (ähnlich wie beim Logger) und die einzige Stelle an der eine feste Abhängigkeit zu FastCache besteht ist im FastCacheBuilder und der cache.ini.

bootstrap.ini

In der bootstrap.ini sollte für üblich auf eine extra Konfigurationsdatei verlinkt werden:

cache.handlers = @@cache.ini

cache.ini

 Die cache.ini sieht z.B. wie folgt aus:

; cache.ini
; all available drivers and settings can be found here: http://www.phpfastcache.com/
default.driver = files
default.path = @../cache
default.htaccess = No
default.cacheFileExtension = cache

redis.driver = predis
redis.defaultTtl = 30000000
redis.@@ = @@./.redis.env.ini

Der erste Key ist hierbei der Name des Handlers. Falls kein anderer Name definiert ist wird "default" verwendet. Nun kann für jede Applikation einzeln der Cache deaktiviert werden und in einzelne Kanäle eingeteilt werden.

Applikationskonfiguration

In der Applikationskonfiguration müssen zur Verwendung vom Cache folgende Dinge hinterlegt werden:

; app.ini
; is cache enabled can be 1 (enable) or 0 (disabled); optional default 0
cache.enabled = 1
; default handler; optional default "default"
cache.handler = default
; enabled can be 1 (enable), 0 (disabled), -1 (inherit / use application flag), optional default -1
;cache.channels.blocks.enabled = 1
cache.channels.blocks.handler = redis

Verwendung

Um nun aus einer Applikation einen Cache zu bekommen kann man sich über das DI einen ApplicationCacheHandler holen und über die Methode ApplicationCacheHandler::getCache($channel = 'default'): ?CacheInterface den Cache erhalten. Falls der Cache für den entsprechenden Kanal aktiviert ist wird ein CacheInterface zurückgegeben, ansonsten NULL.

Um eine Kollision der Cache-Keys zu vermeiden ist wird jedem Key der Kanalname vorgehängt. Sprich in der Applikation "Test" in dem Kanal "Lesen" hat der Cache Eintrag "Datenbank" eigentlich den Key "Test__Lesen_Datenbank".

Wichtiger Hinweis zu CacheInterface::clear()

Dadurch dass mehrere Kanäle/Applikationen den selben CacheHandler (CacheBackend) verwenden sollte bei der Verwendung von CacheInterface::clear() daran gedacht werden, dass hierbei auch andere Cache-Einträge mit gelöscht werden könnten. Deswegen sollte versucht werden clear nur in Ausnahmefällen zu verwenden.

Validierung vom Cache

Anders als mit dem alten Cache gibt es keinen CacheValidator mehr. Aufgrund von PSR16 (und damit der Cache schneller ist) gibt es nur noch eine Validierung auf Zeit. Falls der Cache nicht nach den standardmäßigen 900 Sekunden ungültig sein soll, muss man einfach nur z.B. ein Jahr als Laufzeit eintragen. Bestimmte Cache Backends haben jedoch ein Limit!

Falls die Validierung auf Zeit aber nicht genug ist, kann man nun die ValidationCacheEntry Klasse verwenden. Diese kapselt im Grunde leglich den Psr16Cache. Beispiel:

PHP
/**
 * @var \Psr\SimpleCache\CacheInterface $cache
 */
$validationCacheEntry = new \com\setasign\SetaFramework\SimpleCache\ValidationCacheEntry(
    $cache,
    'dummyConfig',
    new \com\setasign\SetaFramework\SimpleCache\Validator\FileValidator(__DIR__ . '/cache/config.ini')
);

$object = $validationCacheEntry->get();
if ($object === null) {
    $object = \com\setasign\SetaFramework\Config\Config::read(__DIR__.'/cache/config.ini');
    $validationCacheEntry->set($object);
}

Jeder Validator muss das Interface "ValidatorInterface" implementieren. 

Erinnerung: Falls man einen besonderen Validator benötigt kann man einfach eine anonyme Klasse verwenden:

PHP
$specialValidator = new class ($compareHash) implements ValidatorInterface
{
    /**
     * @var null|string
     */
    protected $compareHash;

    public function __construct(?string $compareHash)
    {
        $this->compareHash = $compareHash;
    }

    /**
     * @inheritdoc
     */
    public function getValidationInfo($value)
    {
        return $value['hash'] ?? '';
    }

    /**
     * @inheritdoc
     */
    public function isValid($validationInfo): bool
    {
        return $validationInfo === $this->compareHash;
    }
};