File: Zend_Cache-Introduction.xml

package info (click to toggle)
zendframework 1.12.9%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: jessie-kfreebsd
  • size: 133,584 kB
  • sloc: xml: 1,311,829; php: 570,173; sh: 170; makefile: 125; sql: 121
file content (167 lines) | stat: -rw-r--r-- 6,859 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
<?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>