aus "Stud.IP-Entwicklerdokumentation"

Entwickler: Cache

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:

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:

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:

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:

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.

URL: https://docs.studip.de/develop/Entwickler/Cache
Zuletzt geändert am 16.03.2010 15:30 Uhr