| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- EN-Revision: 20765 -->
- <!-- Reviewed: no -->
- <sect1 id="zend.cache.introduction">
- <title>Einführung</title>
- <para>
- <classname>Zend_Cache</classname> bietet einen generellen Weg für das Cachen von Daten.
- </para>
- <para>
- Cachen im Zend Framework wird mit Frontends durchgeführt, wobei Cache Datensätze über
- Backend Adapter (<emphasis>File</emphasis>, <emphasis>Sqlite</emphasis>,
- <emphasis>Memcached</emphasis>...), 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").
- </para>
- <para>
- Der Kern des Moduls (<classname>Zend_Cache_Core</classname>) ist generell, flexibel und
- konfigurierbar. Nun gibt es - für spezielle Bedürfnisse - Cache Frontends, welche
- <classname>Zend_Cache_Core</classname> erweitern: <emphasis>Output</emphasis>,
- <emphasis>File</emphasis>, <emphasis>Function</emphasis> und <emphasis>Class</emphasis>.
- </para>
- <example id="zend.cache.introduction.example-1">
- <title>Ein Frontend mit Zend_Cache::factory() erzeugen</title>
- <para>
- <methodname>Zend_Cache::factory()</methodname> instanziiert korrekte Objekte und fügt
- sie zusammen. In diesem ersten Beispiel wird das <emphasis>Core</emphasis> Frontend
- zusammen mit dem <emphasis>File</emphasis> Backend verwendet.
- </para>
- <programlisting language="php"><![CDATA[
- $frontendOptions = array(
- 'lifetime' => 7200, // Lebensdauer des Caches 2 Stunden
- 'automatic_serialization' => true
- );
- $backendOptions = array(
- 'cache_dir' => './tmp/' // Verzeichnis, in welches die Cache Dateien kommen
- );
- // Ein Zend_Cache_Core Objekt erzeugen
- $cache = Zend_Cache::factory('Core',
- 'File',
- $frontendOptions,
- $backendOptions);
- ]]></programlisting>
- </example>
- <note>
- <title>Frontends und Backends bestehend aus mehrfachen Wörtern</title>
- <para>
- Bei einige Frontends und Backends werden mehrere Wörter verwendet wie z.B.
- 'ZendPlatform'. Wenn diese der Fabrik spezifiziert werden, müssen diese aufgeteilt
- werden indem man ein Trennzeichen verwendet, wie z.B. das Leerzeichen (' '), Bindestrich
- ('-'), oder den Punkt ('.').
- </para>
- </note>
- <example id="zend.cache.introduction.example-2">
- <title>Das Ergebnis einer Datenbankabfrage cachen</title>
- <para>
- Jetzt, da wir ein Frontend haben, kann jeder Typ von Daten gecached werden
- (Serialisierung ist eingeschaltet). Zum Beispiel können Ergebnisse von sehr
- umfangreichen Datenbankabfragen gecached werden. Nach dem Cachen ist es sogar gar
- nicht mehr notwendig, eine Verbindung zur Datenbank zu machen; Datensätze werden vom
- Cache genommen und deserialisiert.
- </para>
- <programlisting language="php"><![CDATA[
- // $cache initialisiert im vorhergehenden Beispiel
- // Nachsehen, ob der Cache bereits existiert:
- if(!$result = $cache->load('myresult')) {
- // Cache miss; mit Datenbank verbinden
- $db = Zend_Db::factory( [...] );
- $result = $db->fetchAll('SELECT * FROM huge_table');
- $cache->save($result, 'myresult');
- } else {
- // Cache hit! Ausgeben, damit wir es wissen
- echo "Der ist vom Cache!\n\n";
- }
- print_r($result);
- ]]></programlisting>
- </example>
- <example id="zend.cache.introduction.example-3">
- <title>Cache Ausgabe mit dem Zend_Cache Frontend</title>
- <para>
- Abschnitte, in denen die Ausgabe gecached werden soll, werden 'markiert', durch
- Hinzufügen von etwas bedingter Logik, wobei der Abschnitt innerhalb der
- <methodname>start()</methodname> und <methodname>end()</methodname> Methoden gekapselt
- wird (das ähnelt dem ersten Beispiel, und ist eine Kernstrategie für das Cachen).
- </para>
- <para>
- Darin muß die Ausgabe der Daten wie immer geschehen - jede Ausgabe wird gecached, wenn
- die Ausführung auf die <methodname>end()</methodname> 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).
- </para>
- <programlisting language="php"><![CDATA[
- $frontendOptions = array(
- 'lifetime' => 30, // Lebenszeit des Caches 30 Sekunden
- 'automatic_serialization' => false // Dieser Wert ist der Standardwert
- );
- $backendOptions = array('cache_dir' => './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().').';
- ]]></programlisting>
- <para>
- Zu beachten ist dass das Ergebnis von <methodname>time()</methodname> zweimal ausgegeben
- wird; das ist etwas dynamisches für Demonstrationszwecke. Beim Versuch dieses
- auszuführen und mehrfach zu refreshen, kann bemerkt werden, dass sich die erste Nummer
- nie ändert, während die zweite sich ändert, während die Zeit verstreicht. Das
- geschieht, weil die erste Nummer, die im gecacheten Abschnitt ausgegeben wird, im
- Gegensatz zur anderen Ausgabe gecached wurde. Nach einer halben Minute (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.
- </para>
- </example>
- <note>
- <para>
- Wenn <classname>Zend_Cache</classname> benutzt wird, muß auf die wichtigen Cache
- Identifizierungen geachtet werden (welche an <methodname>save()</methodname> und
- <methodname>start()</methodname> übergeben werden). Diese müssen für jede Ressource
- einzigartig sein, die gecached werden soll. Andernfalls würden sich unverknüpfte Cache
- Datensätze gegenseitig entfernen oder, noch schlimmer, anstatt des anderen dargestellt
- werden.
- </para>
- </note>
- </sect1>
|