Introduction to Zend Framework

 Learning Zend Framework

appendix

 Zend Framework Reference


  •  Zend_Gdata
  •  Zend_Http
  •  Zend_InfoCard
  •  Zend_Json
  •  Zend_Layout
  •  Zend_Ldap
  •  Zend_Loader
  •  Zend_Locale
  •  Zend_Log
  •  Zend_Mail
  •  Zend_Markup
  •  Zend_Measure
  •  Zend_Memory
  •  Zend_Mime
  •  Zend_Navigation
  •  Zend_Oauth
  •  Zend_OpenId
  •  Zend_Paginator
  •  Zend_Pdf
  •  Zend_ProgressBar
  •  Zend_Queue
  •  Zend_Reflection
  •  Zend_Registry
  •  Zend_Rest

  •  Zend_Search_Lucene
  •  Zend_Serializer
  •  Zend_Server
  •  Zend_Service
  •  Zend_Session
  •  Zend_Soap
  •  Zend_Tag
  •  Zend_Test
  •  Zend_Text
  •  Zend_TimeSync
  •  Zend_Tool
  •  Zend_Tool_Framework
  •  Zend_Tool_Project
  •  Zend_Translate
  •  Zend_Uri
  •  Zend_Validate
  •  Zend_Version
  •  Zend_View
  •  Zend_Wildfire
  •  Zend_XmlRpc
  • ZendX_Console_Process_Unix
  • ZendX_JQuery
  • Translation 96.1% Update 2010-11-28 - Revision 23448 - Version ZF 1.11.x

    Chapter 17. Zend_Cache

    17.1. Einführung

    Zend_Cache bietet einen generellen Weg für das Cachen von Daten.

    Cachen im Zend Framework wird mit Frontends durchgeführt, wobei Cache Datensätze über Backend Adapter (File, Sqlite, Memcached...), durch ein flexibles System von IDs und Tags, gespeichert werden. Durch deren Verwendung ist es einfach, spezielle Typen von Datensätzen im Nachhinein zu Löschen (zum Beispiel: "Löschen aller Cache Datensätze welche mit einem bestimmten Tag markiert sind").

    Der Kern des Moduls (Zend_Cache_Core) ist generell, flexibel und konfigurierbar. Nun gibt es - für spezielle Bedürfnisse - Cache Frontends, welche Zend_Cache_Core erweitern: Output, File, Function und Class.

    Example 17.1. Ein Frontend mit Zend_Cache::factory() erzeugen

    Zend_Cache::factory() instanziiert korrekte Objekte und fügt sie zusammen. In diesem ersten Beispiel wird das Core Frontend zusammen mit dem File Backend verwendet.

    $frontendOptions = array(
       
    'lifetime' => 7200// Lebensdauer des Caches 2 Stunden
       
    'automatic_serialization' => true
    );

    $backendOptions = array(
        
    'cache_dir' => './tmp/' // Verzeichnis, in welches die Cache Dateien kommen
    );

    // Ein Zend_Cache_Core Objekt erzeugen
    $cache Zend_Cache::factory('Core',
                                 
    'File',
                                 
    $frontendOptions,
                                 
    $backendOptions);

    [Note] Frontends und Backends bestehend aus mehrfachen Wörtern

    Bei einige Frontends und Backends werden mehrere Wörter verwendet wie z.B. 'ZendPlatform'. Wenn diese der Fabrik spezifiziert werden, müssen diese aufgeteilt werden indem man ein Trennzeichen verwendet, wie z.B. das Leerzeichen (' '), Bindestrich ('-'), oder den Punkt ('.').

    Example 17.2. Das Ergebnis einer Datenbankabfrage cachen

    Jetzt, da wir ein Frontend haben, kann jeder Typ von Daten gecached werden (Serialisierung ist eingeschaltet). Zum Beispiel können Ergebnisse von sehr umfangreichen Datenbankabfragen gecached werden. Nach dem Cachen ist es sogar gar nicht mehr notwendig, eine Verbindung zur Datenbank zu machen; Datensätze werden vom Cache genommen und deserialisiert.

    // $cache initialisiert im vorhergehenden Beispiel

    // Nachsehen, ob der Cache bereits existiert:
    if(!$result $cache->load('myresult')) {

        
    // Cache miss; mit Datenbank verbinden

        
    $db Zend_Db::factory( [...] );

        
    $result $db->fetchAll('SELECT * FROM huge_table');

        
    $cache->save($result'myresult');

    } else {

        
    // Cache hit! Ausgeben, damit wir es wissen
        
    echo "Der ist vom Cache!\n\n";

    }

    print_r($result);

    Example 17.3. Cache Ausgabe mit dem Zend_Cache Frontend

    Abschnitte, in denen die Ausgabe gecached werden soll, werden 'markiert', durch Hinzufügen von etwas bedingter Logik, wobei der Abschnitt innerhalb der start() und end() Methoden gekapselt wird (das ähnelt dem ersten Beispiel, und ist eine Kernstrategie für das Cachen).

    Darin muß die Ausgabe der Daten wie immer geschehen - jede Ausgabe wird gecached, wenn die Ausführung auf die end() Methode trifft. Bei der nächsten Ausführung wird der komplette Abschnitt übersprungen, dafür werden die Daten vom Cache geholt (solange der Cache Datensatz gültig ist).

    $frontendOptions = array(
       
    'lifetime' => 30,                   // Lebenszeit des Caches 30 Sekunden
       
    'automatic_serialization' => false  // Dieser Wert ist der Standardwert
    );

    $backendOptions = array('cache_dir' => './tmp/');

    $cache Zend_Cache::factory('Output',
                                 
    'File',
                                 
    $frontendOptions,
                                 
    $backendOptions);

    // Wir übergeben eine eindeutige Identifizierung an die start() Methode
    if(!$cache->start('mypage')) {
        
    // Ausgabe wie gewöhnlich:

        
    echo 'Hallo Welt! ';
        echo 
    'Das ist gecached ('.time().') ';

        
    $cache->end(); // Die Ausgabe wird gespeichert und zum Browser gesendet
    }

    echo 
    'Das wird nie gecached ('.time().').';

    Zu beachten ist dass das Ergebnis von time() zweimal ausgegeben wird; das ist etwas dynamisches für Demonstrationszwecke. Beim Versuch dieses auszuführen und mehrfach zu refreshen, kann bemerkt werden, dass sich die erste Nummer nie ändert, während die zweite sich ändert, während die Zeit verstreicht. Das geschieht, weil die erste Nummer, die im gecacheten Abschnitt ausgegeben wird, im Gegensatz zur anderen Ausgabe gecached wurde. Nach einer halben Minute (die Lebensdauer wurde auf 30 Sekunden gesetzt) sind die Nummern wieder identisch, weil der Cache Eintrag abgelaufen ist - er muß wieder gecached werden. Man sollte das im Browser oder in der Konsole testen.


    [Note] Note

    Wenn Zend_Cache benutzt wird, muß auf die wichtigen Cache Identifizierungen geachtet werden (welche an save() und start() übergeben werden). Diese müssen für jede Ressource einzigartig sein, die gecached werden soll. Andernfalls würden sich unverknüpfte Cache Datensätze gegenseitig entfernen oder, noch schlimmer, anstatt des anderen dargestellt werden.

    digg delicious meneame google twitter technorati facebook

    Comments

    Loading...