| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- <sect1 id="zend.cache.introduction">
- <title>Inleiding</title>
- <para>
- <code>Zend_Cache</code> verstrekt een standaard functie om eender welke data te "cachen".
- </para>
- <para>
- Caching in het Zend Framework word door frontends uitgevoerd, terwijl cache records door backend
- adapters worden opgeslagen (<code>File</code>, <code>Sqlite</code>, <code>Memcache</code>...) via
- een flexibel systeem van IDs en tags. Het gebruik van deze tags laat toe eenvoudig bepaalde
- record types te verwijderen (bijvoorbeeld: "verwijder alle cache records gemarkeerd met een
- bepaalde tag").
- </para>
- <para>
- De kern van de <code>Zend_Cache_Core</code> module is standaard, flexibel en configurabel.
- Er bestaan echter cache frontends voor specifieke doeleinden die <code>Zend_Cache_Core</code>
- uitbreiden: <code>Output</code>, <code>File</code>, <code>Function</code> en <code>Class</code>.
- </para>
- <example>
- <title>Een frontend verkrijgen met <code>Zend_Cache::factory()</code></title>
- <para>
- <code>Zend_Cache::factory()</code> instantieert juiste objecten en bindt ze samen.
- In dit eerste voorbeeld zullen we <code>Core</code> frontend gebruiken, samen met
- <code>File</code> backend.
- </para>
- <programlisting role="php"><![CDATA[<?php
- require_once 'Zend/Cache.php';
- $frontendOptions = array(
- 'lifeTime' => 7200, // cache levensduur van 2 uur
- 'automaticSerialization' => true
- );
- $backendOptions = array(
- 'cacheDir' => './tmp/' // Directory waar we de cache bestanden wegschrijven
- );
- // verkrijgen van een Zend_Cache_Core object
- $cache = Zend_Cache::factory('Core', 'File', $frontendOptions, $backendOptions);
- ?>]]></programlisting>
- <para>
- Nu we een frontend hebben kunnen we eender welk type data cachen (we activeerden serialisatie).
- We kunnen bijvoorbeeld het resultaat van een zeer "dure" database query cachen. Nadat het
- in de cache is opgeslagen, is het zelfs niet meer nodig een verbinding met de database te maken;
- records worden uit de cache gehaald en gedeserialiseerd.
- </para>
- <programlisting role="php"><![CDATA[<?php
- // $cache die in het vorige voorbeeld werd geïnitialiseerd
- // nagaan of de cache reeds bestaat:
- if(!$result = $cache->get('mijnresultaat')) {
- // geen cache; verbind met de database
- $db = Zend_Db::factory( [...] );
- $result = $db->fetchAll('SELECT * FROM enorme_tabel');
- $cache->save($result, 'mijnresultaat');
- } else {
- // cache bestaat! laat het weten
- echo "Dit komt uit de cache!\n\n";
- }
- print_r($result);
- ?>]]></programlisting>
- </example>
- <example>
- <title>Output cachen met de <code>Zend_Cache</code> output frontend</title>
- <para>
- We markeren secties waarin we output willen cachen door er een beetje conditionele
- logica aan toe te voegen. We zetten de sectie tussen <code>start()</code> en <code>end()</code>
- methodes (dit wordt geïllustreerd in het eerste voorbeeld en is de voornaamste strategie
- voor het cachen).
- </para>
- <para>
- Tussen de twee methodes output je je data zoals gewoonlijk - alle output zal worden gecached als
- de uitvoering de <code>end()</code> methode tegenkomt. Bij de volgende uitvoering zal de hele
- sectie worden overgeslagen ten voordele van het verkrijgen van de data uit de cache (zolang de
- cache record geldig is).
- </para>
- <programlisting role="php"><![CDATA[<?php
- $frontendOptions = array(
- 'lifeTime' => 30, // cache levensduur van een halve minuut
- 'automaticSerialization' => false // dit is sowieso standaard
- );
- $backendOptions = array('cacheDir' => './tmp/');
- $cache = Zend_Cache::factory('Output', 'File', $frontendOptions, $backendOptions);
- // we geven een unieke id door aan de start() methode
- if(!$cache->start('mijnpagina')) {
- // output zoals gewoonlijk:
- echo 'Hallo wereld! ';
- echo 'Dit is gecached ('.time().') ';
- $cache->end(); // de output wordt opgeslagen en naar de browser gestuurd
- }
- echo 'Dit word nooit gecached ('.time().').';
- ?>]]> </programlisting>
- <para>
- Merk op dat we het resultaat van <code>time()</code> tweemaal weergeven; dit is iets dynamisch
- om het voorbeeld te toetsen. Probeer het voorbeeld verschillende malen uit te voeren; je zal
- merken dat het eerste nummer niet verandert, terwijl het tweede verandert naargelang de tijd
- vordert. Dit komt omdat het eerste nummer samen met de andere output in de cache werd opgeslaan.
- Na een halve minuut (we hebben de levensduur op 30 seconden gezet) moeten de nummers opnieuw
- gelijk zijn omdat de cache record niet meer geldig is -- voor hij opnieuw word gecached. Je
- zou dit in je browser of console moeten proberen.
- </para>
- </example>
- <note><para>
- Als je <code>Zend_Cache</code> gebruikt, let dan op de belangrijke cache id (doorgegeven aan
- <code>save()</code> en <code>start()</code>. Die moet uniek zijn voor elk deel data die je wil
- cachen, anders kunnen cache records die niets met elkaar te maken hebben elkaar uitwissen of,
- erger nog, afgebeeld worden in plaats van de ander.
- </para></note>
- </sect1>
- <!--
- vim:se ts=4 sw=4 et:
- -->
|