Zend_Cache-Introduction.xml 6.5 KB

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