Zend_Cache-Introduction.xml 6.5 KB

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