Zend_Cache-Introduction.xml 6.7 KB

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