SideBarMenu

Stud.IP-Cache

Stud.IP enthält ein minimales Framework, um Variablen bzw. deren Inhalt zu cachen. In der Datei lib/classes/caching.php sind die folgenden Klassen und Interfaces enthalten:

 * Klasse StudipCacheFactory
 * Interface StudipCache
 * Klasse StudipNullCache

Seit Version 1.11 ist das Caching fester Bestandteil (FileCaching) und standardmässig aktiviert.

StudipCacheFactory

Die Aufgabe der StudipCacheFactory ist das zur Verfügung stellen eines Stud.IP-weiten Caches. Um die Singleton-Instanz zu erhalten, muss lediglich StudipCacheFactory::getCache() aufgerufen werden.

StudipCache

Das Interface StudipCache definiert die Operationen einer Cache-Instanz:

  • #expire($key): entfernt ein Schlüssel-Wert-Paar aus dem Cache
  • #read($key): liest den Wert zu einem Schlüssel aus dem Cache oder gibt im Falle eines cache miss FALSE zurück
  • #write($key, $value, $expire = 43200): legt unter einem Schlüssel für eine gegebene Zeit (in Sekunden) einen Wert ab

Der Cache kann dazu verwendet werden, über mehrere HTTP-Requests hinweg einen möglicherweise aufwendig zu berechnenden Wert zu speichern. Der Cache garantiert nicht, dass ein Schlüssel-Wert-Paar für die gesamte expire-Dauer vorgehalten wird. Er garantiert lediglich, dass das Schlüssel-Wert-Paar nach Ablauf nicht mehr zurückgeliefert wird.

Der Lebenszyklus eines Schlüssel-Wert-Eintrags in den Cache sieht so aus:

  • Der Eintrag wird mit #write eingetragen.
  • Nun kann der Eintrag mit #read und dem Schlüssel ausgelesen werden.
  • Der Eintrag scheidet unter folgenden Bedingungen aus:
    • Die Lebensdauer ist überschritten worden.
    • Es wurde explizit #expire aufgerufen.
    • Der Cache entfernt den Wert z.B. aus Platzmangel.

In der Regel sollte man nur Resultate referenziell transparenter Funktionen cachen, andernfalls muss man sich selbst um die Invalidierung des gespeicherten Wertes kümmern, wenn das alte Resultat ungültig wird. Dazu stehen drei Möglichkeiten zur Verfügung:

  • Man verwendet die eingestellte Lebensdauer.
  • Man entfernt die Einträge per #expire.
  • Man wählt den Schlüssel geschickt.

Beispiel: Es soll eine Liste der Geburststagskinder angezeigt werden. Da die Berechnung aufwendig ist, soll das Ergebnis gespeichert werden. Ab Mitternacht ist die Liste neu zu berechnen. Unter Berücksichtigung der obigen drei Punkte kann man also folgendermaßen vorgehen:

  • Beim Eintragen in den Cache rechnet man aus, wieviele Sekunden noch bis Mitternacht vergehen und stellt die Lebensdauer entsprechend ein.
  • Man liest nicht nur die Liste aus dem Cache aus, sondern noch einen zweiten Wert, der angibt, für welchen Tag diese Liste ist. Falls man sich an einem anderen Tag befindet, berechnet man neu.
  • Man nimmt den aktuellen Tag im Monat in den Schlüssel des Cache-Eintrags auf: "birthdays/22". Am 22. wird die Liste ausgelesen; nach Mitternacht (der Schlüssel ist ja dann "birthdays/23") findet man keinen Eintrag und berechnet neu.

Ganz offensichtlich ist (in diesem Fall) die letzte Möglichkeit die eleganteste.

Konvention

Der Schlüssel eines Cache-Eintrags wird durch Vorwärtsschrägstriche "/" in Namensräume aufgeteilt. Stud.IP-Kerndateien sollten "core/XYZ/argument1/argument2/usw" erzeugen. Stud.IP-Plugins sollten dementsprechend "plugin/birthday/22" verwenden. Auf diese Weise sollte es zu keinen Kollisionen kommen.

Achtung

Der Schlüssel und der Wert eines Cache-Eintrags müssen Strings sein. Arrays oder Objekte müssen (de)serialisiert werden.

Funktionsbeispiele

  1. //Beispiel beim schwarzenBrettPlugin
  2.  
  3. // Konstante in der Klasse festlegen
  4. const ARTIKEL_CACHE_KEY = 'plugins/SchwarzesBrettPlugin/artikel/';
  5.  
  6. //Beispielfunktion
  7. private function getArtikel($thema_id)
  8. {
  9.     // Cache-Objekt erzeugen
  10.     $cache = StudipCacheFactory::getCache();
  11.     // Daten aus dem Cache holen
  12.     $ret = unserialize($cache->read(self::ARTIKEL_CACHE_KEY.$thema_id));
  13.  
  14.     // Wenn der Cache leer ist, Daten aus der Datenbank holen
  15.     if(empty($ret)){
  16.         $ret = DBManager::get()->query("SELECT ...")->fetchAll(PDO::FETCH_COLUMN);
  17.         // Daten in den Cache schreiben
  18.         $cache->write(self::ARTIKEL_CACHE_KEY.$thema_id, serialize($ret));
  19.     }
  20.     return $ret;
  21. }

StudipNullCache

Da es sich bei StudipCache nur um ein Interface handelt, muss eine konkrete Implementation zur Verfügung gestellt werden. Stud.IP wird dabei lediglich mit dem StudipNullCache ausgeliefert, der dann zwar von der Factory zurückgeliefert wird und auch entsprechend und gültig antwortet, aber tatsächlich nicht speichert. Ein geschriebener Wert wird also nie zurückgelesen. Tatsächlich cachende Implementationen des Interfaces müssen über entsprechende Plugins nachträglich installiert werden. PHP für sich bietet nämlich keine (guten) Möglichkeiten, jedoch gibt es spezielle PHP-Erweiterungen, die PHP damit nachrüsten bzw. externe Lösung verfügbar machen.

CachePlugins

Derzeit existieren 4 verschiedene Plugins:

Für die Konfiguration der Erweiterung muss die entsprechende Dokumentation befolgt werden, da der Cache sonst nicht funktionieren wird.

Letzte Änderung am 16.03.2010 15:30 Uhr von mriehe.