Kapitel 2. Zend_Cache
Zurück |  | Weiter

## Kapitel 2. Zend_Cache

## 2.1. Einführung

`Zend_Cache` bietet einen generellen Weg für das Cachen von Daten.

Cachen im Zend Framework wird mit Frontends durchgeführt, wobei Cache Datensätze über Backend Adapter (`File`, `Sqlite`, `Memcache`...), durch ein flexibles System von IDs und Tags, gespeichert werden. Durch deren Verwendung ist es einfach spezielle Typen von Datensätzen im Nachhinein zu Löschen (zum Beispiel: "Löschen aller Cache Datensätze welche mit einem bestimmten Tag markiert sind").

Der Kern des Moduls (`Zend_Cache_Core`) ist generell, flexibel und konfigurierbar. Nun gibt es, für spezielle Bedürfnisse, Cache Frontends welche `Zend_Cache_Core` erweitern: `Output`, `File`, `Function` und `Class`.

Beispiel 2.1. Ein Frontend mit `Zend_Cache::factory()` erzeugen

`Zend_Cache::factory()` instanziiert korrekte Objekte und fügt Sie zusammen. In diesem ersten Beispiel wird das `Core` Frontend zusammen mit dem `File` Backend verwendet.

    <?php
    require_once 'Zend/Cache.php';

    $frontendOptions = array(
       'lifeTime' => 7200, // Lebensdauer des Caches 2 Stunden
       'automaticSerialization' => true
    );

    $backendOptions = array(
        'cacheDir' => './tmp/' // Verzeichnis in welches die Cache Dateien kommen
    );

    // Ein Zend_Cache_Core Objekt erzeugen
    $cache = Zend_Cache::factory('Core', 'File', $frontendOptions, $backendOptions);

    ?>

Jetzt, da wir ein Frontend haben, kann jeder Typ von Daten gecached werden (Serialisierung ist eingeschaltet). Zum Beispiel können Ergebnisse von sehr umfangreichen Datenbank Abfragen gecached werden. Nach dem Cachen ist es sogar gar nicht nicht mehr notwendig eine Verbindung zur Datenbank zu machen; Datensätze werden vom Cache genommen und Deserialisiert.

    <?php

    // $cache initialisiert im vorhergehenden Beispiel

    // Nachsehen ob der Cache bereits existiert:
    if(!$result = $cache->get('myresult')) {

        // Cache miss; zur Datenbank verbinden

        $db = Zend_Db::factory( [...] );

        $result = $db->fetchAll('SELECT * FROM huge_table');

        $cache->save($result, 'myresult');

    } else {

        // Cache hit! Schreie damit wir es wissen
        echo "Der ist vom Cache!\n\n";

    }

    print_r($result);

    ?>

Beispiel 2.2. Cache Ausgabe mit dem `Zend_Cache` Frontend

Abschnitte, in denen die Ausgabe gecached werden soll, werden 'markiert', durch hinzufügen von etwas bedingter Logik, wobei der Abschnitt innerhalb der `start()` und `end()` Methoden gekapselt wird (das ähnelt dem ersten Beispiel, und ist eine Kern Strategie für das Cachen).

Darin muß die Ausgabe der Daten wie immer geschehen - jede Ausgabe wird gecached wenn die Ausführung auf die `end()` Methode trifft. Bei der nächsten Ausführung wird der komplette Abschnitt übersprungen dafür werden die Daten vom Cache geholt (solange der Cache Datensatz gültig ist).

    <?php

    $frontendOptions = array(
       'lifeTime' => 30,                  // Lebenszeit des Caches cache lifetime of half a minute
       'automaticSerialization' => false  // Dieser Wert ist auf alle Fälle Standard
    );

    $backendOptions = array('cacheDir' => './tmp/');

    $cache = Zend_Cache::factory('Output', 'File', $frontendOptions, $backendOptions);

    // Wir übergeben eine eindeutige Identifizierung an die start() Methode
    if(!$cache->start('mypage')) {
        // Ausgabe wie gewöhnlich:

        echo 'Hallo Welt! ';
        echo 'Das ist gecached ('.time().') ';

        $cache->end(); // Die Ausgabe wird gespeichert und zum Browser gesendet
    }

    echo 'Das wird nie gecached ('.time().').';

    ?>

Zu beachten ist das das Ergebnis von `time()` zweimal ausgegeben wird; das ist etwas dynamisches für Demonstrations Zwecke. Beim Versuch dieses Auszuführen und mehrfach zu Refreshen, kann bemerkt werden, das sich die erste Nummer nie ändert, wärend die zweite sich ändert wärend die Zeit verstreicht. Das ist weil die erste Nummer, die im gecacheten Abschnitt ausgegeben wird, im Gegensatz zur anderen Ausgabe gecached wurde. Nach einer halben Mintuten (die Lebensdauer wurde auf 30 Sekunden gesetzt) sind die Nummern wieder identisch weil der Cache Eintrag abgelaufen ist -- er muß wieder gecached werden. Man sollte das im Browser oder in der Konsole testen.

| Anmerkung
Wenn Zend_Cache benutzt wird, muß auf die wichtigen Cache Identifizierungen geachten werden (welche an `save()` und `start()` übergeben werden). Diese müssen einzigartig sein, für jede Ressource die gecached werden soll. Andernfalls würden sich unverknüpfte Cache Datensätze gegenseitig entfernen oder, noch schlimmer, anstatt des anderen dargestellt werden.

Zurück |  | Weiter
1.8. Zend::registry() | Zum Anfang | 2.2. Die Theorie des Cachens