0 follower

Cachen von Daten

Beim Datencaching geht es um das Speichern und spätere Beziehen einer PHP-Variable im bzw. aus dem Cache. Die Basisklasse der Cache-Komponente, CCache, stellt die zwei Methoden zur Verfügung, die meistens dafür verwendet werden: set() und get().

Um eine Variable $value im Cache zu speichern, wählen wir eine eindeutige ID und rufen set() auf, um sie zu speichern:

Yii::app()->cache->set($id, $value);

Die gecachten Daten verbleiben für immer im Cache, außer sie werden aufgrund bestimmter Cache-Richtlinien entfernt (z.B. wenn die ältesten Cache-Daten gelöscht werden, weil der Cache-Speicherplatz voll ist). Um dieses Verhalten zu verändern, können wir beim Aufruf von set() einen weiteren Parameter angeben, so dass die Daten nach einer bestimmten Zeitspanne ungültig werden:

// Daten für max. 30 Sekunden um Cache halten
Yii::app()->cache->set($id, $value, 30);

Wenn wir später (im gleichen oder einem späteren Request) auf diese Daten zugreifen müssen, rufen wir get() mit der ID auf, um die Daten aus dem Cache auszulesen. Falls false zurückgeliefert wird, bedeutet das, dass der Wert nicht im Cache verfügbar ist und wir ihn neu generieren sollten.

$value=Yii::app()->cache->get($id);
if($value===false)
{
    // $value neu generieren und für spätere Zwecke im Cache 
    // speichern, da der Wert nicht im Cache gefunden wurde
    // Yii::app()->cache->set($id,$value);
}

Sie müssen darauf achten, dass Sie für jede im Cache gespeicherte Variable, eine eindeutige ID wählen. Es ist allerdings NICHT nötig, dass die ID auch zwischen unterschiedlichen Applikationen eindeutig ist. Die Cache-Komponente ist intelligent genug, um zwischen IDs von unterschiedlichen Anwendungen zu unterscheiden.

Einige Cachespeicher, wie MemCache oder APC, unterstützen die Abfrage mehrerer gespeicherter Werte auf einmal. Dadurch kann der Overhead beim Abrufen von gecachten Daten reduziert wreden. Seit Version 1.0.8 unterstützt die neue Funktion mget() dieses Feature. Falls der zugrundeliegende Cachespeicher dieses Feature nicht unterstützt, wird es von mget() simuliert.

Rufen Sie delete() auf, um einen gecachten Eintrag aus dem Cache zu entfernen, bzw. flush() um den Cache komplett zu leeren. Seien Sie beim Aufruf von flush() jedoch vorsichtig, da damit auch alle gecachten Einträge von anderen Applikationen aus dem Cache entfernt werden.

Tipp: Da CCache das Interface ArrayAccess implementiert, kann eine Cache-Komponente wie ein Array verwendet werden. Hier einige Beispiele:

$cache=Yii::app()->cache;
$cache['var1']=$value1;  // äquivalent zu: $cache->set('var1',$value1);
$value2=$cache['var2'];  // äquivalent zu: $value2=$cache->get('var2');

1. Cachen mit Abhängigkeit

Die Gültigkeit gecachter Einträge kann neben einer gesetzten Verfallszeit auch von bestimmten Änderungen abhängig gemacht werden. Wenn wir zum Beispiel den Inhalt einer Datei cachen und diese Datei verändert wird, sollten wir die gecachte Kopie für ungültig erklären und statt des gecachten Eintrags, den aktualisierten Inhalt der Datei einlesen.

Eine Abhängigkeit (engl.: dependency) wird durch eine Instanz vom Typ CCacheDependency oder einer Kindklasse davon dargestellt. Beim Aufruf von set() übergeben wir diese Instanz zusammen mit den zu cachenden Daten.

// Der Wert verfällt in 30 Sekunden. Er kann auch schon eher verfallen
// wenn die abhängige Datei verändert wird
Yii::app()->cache->set($id, $value, 30, new CFileCacheDependency('DateiName'));

Wenn wir nun get() aufrufen, um $value auszulesen, wird die Abhängigkeit ausgewertet. Falls es dort eine Änderung gab, wird false zurückgeliefert, was anzeigt, dass die Daten neu generiert werden müssen.

Im folgenden eine Übersicht der verfügbaren Abhängigkeiten für einen Cache:

  • CFileCacheDependency: Eine Änderung bei dieser Abhängigkeit tritt auf, wenn sich bei der Datei der Änderungszeitpunkt verändert hat.

  • CDirectoryCacheDependency: Eine Änderung bei dieser Abhängigkeit tritt auf, wenn eine der Dateien im Verzeichnis oder dessen Unterverzeichnissen geändert wurde.

  • CDbCacheDependency: Eine Änderung bei dieser Abhängigkeit tritt auf, wenn das Ergebnis der SQL-Abfrage sich geändert hat.

  • CGlobalStateCacheDependency: Eine Änderung bei dieser Abhängigkeit tritt auf, wenn der Wert des angegebenen globalen Status sich verändert hat. Ein globaler Status ist eine Variable, deren Wert über mehrere Requests und Sessions hinweg beständig bleibt. Er wird über CApplication::setGlobalState() definiert.

  • CChainedCacheDependency: Eine Änderung bei dieser Abhängigkeit tritt auf, wenn bei einer der Abhängigkeiten der Kette eine Änderung eingetreten ist.

  • CExpressionDependency: Eine Änderung bei dieser Abhängigkeit tritt auf, wenn das Ergebnis des angegebenen PHP-Ausdrucks sich ändert. Diese Klasse steht seit Version 1.0.4 zur Verfügung.