Zend_Cache-Introduction.xml 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. <sect1 id="zend.cache.introduction">
  2. <title>Inleiding</title>
  3. <para>
  4. <code>Zend_Cache</code> verstrekt een standaard functie om eender welke data te "cachen".
  5. </para>
  6. <para>
  7. Caching in het Zend Framework word door frontends uitgevoerd, terwijl cache records door backend
  8. adapters worden opgeslagen (<code>File</code>, <code>Sqlite</code>, <code>Memcache</code>...) via
  9. een flexibel systeem van IDs en tags. Het gebruik van deze tags laat toe eenvoudig bepaalde
  10. record types te verwijderen (bijvoorbeeld: "verwijder alle cache records gemarkeerd met een
  11. bepaalde tag").
  12. </para>
  13. <para>
  14. De kern van de <code>Zend_Cache_Core</code> module is standaard, flexibel en configurabel.
  15. Er bestaan echter cache frontends voor specifieke doeleinden die <code>Zend_Cache_Core</code>
  16. uitbreiden: <code>Output</code>, <code>File</code>, <code>Function</code> en <code>Class</code>.
  17. </para>
  18. <example>
  19. <title>Een frontend verkrijgen met <code>Zend_Cache::factory()</code></title>
  20. <para>
  21. <code>Zend_Cache::factory()</code> instantieert juiste objecten en bindt ze samen.
  22. In dit eerste voorbeeld zullen we <code>Core</code> frontend gebruiken, samen met
  23. <code>File</code> backend.
  24. </para>
  25. <programlisting role="php"><![CDATA[<?php
  26. require_once 'Zend/Cache.php';
  27. $frontendOptions = array(
  28. 'lifeTime' => 7200, // cache levensduur van 2 uur
  29. 'automaticSerialization' => true
  30. );
  31. $backendOptions = array(
  32. 'cacheDir' => './tmp/' // Directory waar we de cache bestanden wegschrijven
  33. );
  34. // verkrijgen van een Zend_Cache_Core object
  35. $cache = Zend_Cache::factory('Core', 'File', $frontendOptions, $backendOptions);
  36. ?>]]></programlisting>
  37. <para>
  38. Nu we een frontend hebben kunnen we eender welk type data cachen (we activeerden serialisatie).
  39. We kunnen bijvoorbeeld het resultaat van een zeer "dure" database query cachen. Nadat het
  40. in de cache is opgeslagen, is het zelfs niet meer nodig een verbinding met de database te maken;
  41. records worden uit de cache gehaald en gedeserialiseerd.
  42. </para>
  43. <programlisting role="php"><![CDATA[<?php
  44. // $cache die in het vorige voorbeeld werd geïnitialiseerd
  45. // nagaan of de cache reeds bestaat:
  46. if(!$result = $cache->get('mijnresultaat')) {
  47. // geen cache; verbind met de database
  48. $db = Zend_Db::factory( [...] );
  49. $result = $db->fetchAll('SELECT * FROM enorme_tabel');
  50. $cache->save($result, 'mijnresultaat');
  51. } else {
  52. // cache bestaat! laat het weten
  53. echo "Dit komt uit de cache!\n\n";
  54. }
  55. print_r($result);
  56. ?>]]></programlisting>
  57. </example>
  58. <example>
  59. <title>Output cachen met de <code>Zend_Cache</code> output frontend</title>
  60. <para>
  61. We markeren secties waarin we output willen cachen door er een beetje conditionele
  62. logica aan toe te voegen. We zetten de sectie tussen <code>start()</code> en <code>end()</code>
  63. methodes (dit wordt geïllustreerd in het eerste voorbeeld en is de voornaamste strategie
  64. voor het cachen).
  65. </para>
  66. <para>
  67. Tussen de twee methodes output je je data zoals gewoonlijk - alle output zal worden gecached als
  68. de uitvoering de <code>end()</code> methode tegenkomt. Bij de volgende uitvoering zal de hele
  69. sectie worden overgeslagen ten voordele van het verkrijgen van de data uit de cache (zolang de
  70. cache record geldig is).
  71. </para>
  72. <programlisting role="php"><![CDATA[<?php
  73. $frontendOptions = array(
  74. 'lifeTime' => 30, // cache levensduur van een halve minuut
  75. 'automaticSerialization' => false // dit is sowieso standaard
  76. );
  77. $backendOptions = array('cacheDir' => './tmp/');
  78. $cache = Zend_Cache::factory('Output', 'File', $frontendOptions, $backendOptions);
  79. // we geven een unieke id door aan de start() methode
  80. if(!$cache->start('mijnpagina')) {
  81. // output zoals gewoonlijk:
  82. echo 'Hallo wereld! ';
  83. echo 'Dit is gecached ('.time().') ';
  84. $cache->end(); // de output wordt opgeslagen en naar de browser gestuurd
  85. }
  86. echo 'Dit word nooit gecached ('.time().').';
  87. ?>]]> </programlisting>
  88. <para>
  89. Merk op dat we het resultaat van <code>time()</code> tweemaal weergeven; dit is iets dynamisch
  90. om het voorbeeld te toetsen. Probeer het voorbeeld verschillende malen uit te voeren; je zal
  91. merken dat het eerste nummer niet verandert, terwijl het tweede verandert naargelang de tijd
  92. vordert. Dit komt omdat het eerste nummer samen met de andere output in de cache werd opgeslaan.
  93. Na een halve minuut (we hebben de levensduur op 30 seconden gezet) moeten de nummers opnieuw
  94. gelijk zijn omdat de cache record niet meer geldig is -- voor hij opnieuw word gecached. Je
  95. zou dit in je browser of console moeten proberen.
  96. </para>
  97. </example>
  98. <note><para>
  99. Als je <code>Zend_Cache</code> gebruikt, let dan op de belangrijke cache id (doorgegeven aan
  100. <code>save()</code> en <code>start()</code>. Die moet uniek zijn voor elk deel data die je wil
  101. cachen, anders kunnen cache records die niets met elkaar te maken hebben elkaar uitwissen of,
  102. erger nog, afgebeeld worden in plaats van de ander.
  103. </para></note>
  104. </sect1>
  105. <!--
  106. vim:se ts=4 sw=4 et:
  107. -->