| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- EN-Revision: 15103 -->
- <!-- 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
- (<code>File</code>, <code>Sqlite</code>, <code>Memcached</code>...), 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: <code>Output</code>, <code>File</code>, <code>Function</code> und <code>Class</code>.
- </para>
- <example id="zend.cache.introduction.example-1">
- <title>Ein Frontend mit <classname>Zend_Cache::factory()</classname> erzeugen</title>
- <para>
- <classname>Zend_Cache::factory()</classname> instanziiert korrekte Objekte und fügt sie zusammen.
- In diesem ersten Beispiel wird das <code>Core</code> Frontend zusammen mit dem
- <code>File</code> Backend verwendet.
- </para>
- <programlisting role="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 nicht mehr notwendig, eine Verbindung
- zur Datenbank zu machen; Datensätze werden vom Cache genommen und deserialisiert.
- </para>
- <programlisting role="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 <classname>Zend_Cache</classname> 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 <code>start()</code> und <code>end()</code> 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 <code>end()</code> 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 role="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 das das Ergebnis von <code>time()</code> 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
- <code>save()</code> und <code>start()</code> ü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>
- <!--
- vim:se ts=4 sw=4 et:
- +-->
|