Zend_Cache-Introduction.xml 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 20765 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.cache.introduction">
  5. <title>Einführung</title>
  6. <para>
  7. <classname>Zend_Cache</classname>
  8. bietet einen generellen Weg für das Cachen von Daten.
  9. </para>
  10. <para>
  11. Cachen im Zend Framework wird mit Frontends durchgeführt, wobei Cache
  12. Datensätze über
  13. Backend Adapter (
  14. <emphasis>File</emphasis>
  15. ,
  16. <emphasis>Sqlite</emphasis>
  17. ,
  18. <emphasis>Memcached</emphasis>
  19. ...), durch ein flexibles System von IDs und Tags, gespeichert
  20. werden. Durch deren Verwendung ist es einfach, spezielle Typen von
  21. Datensätzen im Nachhinein
  22. zu Löschen (zum Beispiel: "Löschen aller Cache Datensätze welche mit
  23. einem bestimmten Tag
  24. markiert sind").
  25. </para>
  26. <para>
  27. Der Kern des Moduls (
  28. <classname>Zend_Cache_Core</classname>
  29. ) ist generell, flexibel und
  30. konfigurierbar. Nun gibt es - für spezielle Bedürfnisse - Cache Frontends, welche
  31. <classname>Zend_Cache_Core</classname>
  32. erweitern:
  33. <emphasis>Output</emphasis>
  34. ,
  35. <emphasis>File</emphasis>
  36. ,
  37. <emphasis>Function</emphasis>
  38. und
  39. <emphasis>Class</emphasis>
  40. .
  41. </para>
  42. <example id="zend.cache.introduction.example-1">
  43. <title>Ein Frontend mit Zend_Cache::factory() erzeugen</title>
  44. <para>
  45. <methodname>Zend_Cache::factory()</methodname>
  46. instanziiert korrekte Objekte und fügt
  47. sie zusammen. In diesem ersten Beispiel wird das
  48. <emphasis>Core</emphasis>
  49. Frontend
  50. zusammen mit dem
  51. <emphasis>File</emphasis>
  52. Backend verwendet.
  53. </para>
  54. <programlisting language="php"><![CDATA[
  55. $frontendOptions = array(
  56. 'lifetime' => 7200, // Lebensdauer des Caches 2 Stunden
  57. 'automatic_serialization' => true
  58. );
  59. $backendOptions = array(
  60. 'cache_dir' => './tmp/' // Verzeichnis, in welches die Cache Dateien kommen
  61. );
  62. // Ein Zend_Cache_Core Objekt erzeugen
  63. $cache = Zend_Cache::factory('Core',
  64. 'File',
  65. $frontendOptions,
  66. $backendOptions);
  67. ]]></programlisting>
  68. </example>
  69. <note>
  70. <title>Frontends und Backends bestehend aus mehrfachen Wörtern</title>
  71. <para>
  72. Bei einige Frontends und Backends werden mehrere Wörter verwendet wie
  73. z.B.
  74. 'ZendPlatform'. Wenn diese der Fabrik spezifiziert werden, müssen diese aufgeteilt
  75. werden indem man ein Trennzeichen verwendet, wie z.B. das Leerzeichen
  76. (' '), Bindestrich
  77. ('-'), oder den Punkt ('.').
  78. </para>
  79. </note>
  80. <example id="zend.cache.introduction.example-2">
  81. <title>Das Ergebnis einer Datenbankabfrage cachen</title>
  82. <para>
  83. Jetzt, da wir ein Frontend haben, kann jeder Typ von Daten gecached werden
  84. (Serialisierung ist eingeschaltet). Zum Beispiel können Ergebnisse
  85. von sehr
  86. umfangreichen Datenbankabfragen gecached werden. Nach dem Cachen ist es sogar gar
  87. nicht mehr notwendig, eine Verbindung zur Datenbank zu machen;
  88. Datensätze werden vom
  89. Cache genommen und deserialisiert.
  90. </para>
  91. <programlisting language="php"><![CDATA[
  92. // $cache initialisiert im vorhergehenden Beispiel
  93. // Nachsehen, ob der Cache bereits existiert:
  94. if(!$result = $cache->load('myresult')) {
  95. // Cache miss; mit Datenbank verbinden
  96. $db = Zend_Db::factory( [...] );
  97. $result = $db->fetchAll('SELECT * FROM huge_table');
  98. $cache->save($result, 'myresult');
  99. } else {
  100. // Cache hit! Ausgeben, damit wir es wissen
  101. echo "Der ist vom Cache!\n\n";
  102. }
  103. print_r($result);
  104. ]]></programlisting>
  105. </example>
  106. <example id="zend.cache.introduction.example-3">
  107. <title>Cache Ausgabe mit dem Zend_Cache Frontend</title>
  108. <para>
  109. Abschnitte, in denen die Ausgabe gecached werden soll, werden
  110. 'markiert', durch
  111. Hinzufügen von etwas bedingter Logik, wobei der Abschnitt innerhalb der
  112. <methodname>start()</methodname>
  113. und
  114. <methodname>end()</methodname>
  115. Methoden gekapselt
  116. wird (das ähnelt dem ersten Beispiel, und ist eine Kernstrategie für das
  117. Cachen).
  118. </para>
  119. <para>
  120. Darin muß die Ausgabe der Daten wie immer geschehen - jede Ausgabe
  121. wird gecached, wenn
  122. die Ausführung auf die
  123. <methodname>end()</methodname>
  124. Methode trifft. Bei der nächsten
  125. Ausführung wird der komplette Abschnitt übersprungen, dafür werden die Daten
  126. vom Cache
  127. geholt (solange der Cache Datensatz gültig ist).
  128. </para>
  129. <programlisting language="php"><![CDATA[
  130. $frontendOptions = array(
  131. 'lifetime' => 30, // Lebenszeit des Caches 30 Sekunden
  132. 'automatic_serialization' => false // Dieser Wert ist der Standardwert
  133. );
  134. $backendOptions = array('cache_dir' => './tmp/');
  135. $cache = Zend_Cache::factory('Output',
  136. 'File',
  137. $frontendOptions,
  138. $backendOptions);
  139. // Wir übergeben eine eindeutige Identifizierung an die start() Methode
  140. if(!$cache->start('mypage')) {
  141. // Ausgabe wie gewöhnlich:
  142. echo 'Hallo Welt! ';
  143. echo 'Das ist gecached ('.time().') ';
  144. $cache->end(); // Die Ausgabe wird gespeichert und zum Browser gesendet
  145. }
  146. echo 'Das wird nie gecached ('.time().').';
  147. ]]></programlisting>
  148. <para>
  149. Zu beachten ist dass das Ergebnis von
  150. <methodname>time()</methodname>
  151. zweimal ausgegeben
  152. wird; das ist etwas dynamisches für Demonstrationszwecke. Beim Versuch
  153. dieses
  154. auszuführen und mehrfach zu refreshen, kann bemerkt werden, dass sich die erste
  155. Nummer
  156. nie ändert, während die zweite sich ändert, während die Zeit
  157. verstreicht. Das
  158. geschieht, weil die erste Nummer, die im gecacheten Abschnitt ausgegeben wird,
  159. im
  160. Gegensatz zur anderen Ausgabe gecached wurde. Nach einer halben Minute (die
  161. Lebensdauer
  162. wurde auf 30 Sekunden gesetzt) sind die Nummern wieder identisch, weil der
  163. Cache
  164. Eintrag abgelaufen ist - er muß wieder gecached werden. Man sollte das im
  165. Browser oder
  166. in der Konsole testen.
  167. </para>
  168. </example>
  169. <note>
  170. <para>
  171. Wenn
  172. <classname>Zend_Cache</classname>
  173. benutzt wird, muß auf die wichtigen Cache
  174. Identifizierungen geachtet werden (welche an
  175. <methodname>save()</methodname>
  176. und
  177. <methodname>start()</methodname>
  178. übergeben werden). Diese müssen für jede Ressource
  179. einzigartig sein, die gecached werden soll. Andernfalls würden sich unverknüpfte
  180. Cache
  181. Datensätze gegenseitig entfernen oder, noch schlimmer, anstatt des anderen
  182. dargestellt
  183. werden.
  184. </para>
  185. </note>
  186. </sect1>