Einführung

Einführung – Einführung zu Cache_Lite

Description

PEAR::Cache_Lite ist ein schlankes Cache-System. Es wurde optimiert für Websites mit hohen Zugriffszahlen, so dass es sehr schnell und sicher ist, da es Datei-Locking und Verletzungs-Tests durchführt.

Eine unabhängige Dokumentation des Packages auf Chinesisch befindet sich hier: http://rainx.phpmore.com/manual/cache_lite.html.

Ziele und technische Details

Geschwindigkeit

Primär sollte PEAR::Cache_Lite sehr schnell sein. Deshalb benutzt es PEAR sowenig wie möglich, um den Einsatz auch bei Webseiten mit hohem Datenaufkommen, ohne Hardware-basierte Lösungen einsetzten zu müssen.

Sie finden weitere Informationen über die in PEAR::Cache_Lite eingesetzte Technik in this document. Der Hauptgedanke ist, die Datei PEAR.php nur dann zu inkludieren, wenn ein Fehler auftritt, was sehr selten passiert.

Einfachheit

Da das Cache-System häufig Bestandteil der Applikationsschicht ist, muss der Kern von PEAR::Cache_Lite sehr klein und flexibel sein. Auch steht er deshalb unter eine entsprechenden Lizenz: der LGPL. Zusätzliche Funktionen befinden sich in weiteren Dateien, die den Kern erweitern.

Sicherheit

Auf Webseiten mit hohem Datenaufkommen muss ernsthaft gegen Datenbeschädigungen im Cache geschützt werden, da konkurrierende Schreib- und Lesezugriffe auftretten können. Wenige Cache-Systeme bieten einen Schutz dagegen.

Datei-Locks sind keine perfekte Lösung, da sie bei NFS oder multithreaded Servern nicht funktionieren. Deshalb besitzt PEAR::Cache_Lite zusätzlich zwei transparente Mechanismen, auf Basis von Hashs, um die Datenintegrität unter allen Umständen zu gewährleisten.

Benutzung

Allgemeine Benutzung

Jedes Modul von PEAR::Cache_Lite folgt der gleichen Philosophie.

Parameter werden per assozitiven Array an den Konstruktor übergeben.

Eine Cache-Datei wird identifiziert anhand einer Cache-ID und einer optionalen Gruppe. Die Logik, nach der die IDs vergeben werden, ist dem Entwickler überlassen.

Im Folgenden meint der Ausdruck Gruppe (engl.: group) einen Pool von Cache-Dateien und der Ausdruck Block als ein Bestandteil einer HTML-Seite.

Kern

Wir beginnen mit einem einfachen Beispiel: die Seite wird erzeugt und dann in einer eindeutigen String-Variable gespeichert

<?php

// Include the package
require_once('Cache/Lite.php');

// Set a id for this cache
$id '123';

// Set a few options
$options = array(
    
'cacheDir' => '/tmp/',
    
'lifeTime' => 3600
);

// Create a Cache_Lite object
$Cache_Lite = new Cache_Lite($options);

// Test if thereis a valide cache for this id
if ($data $Cache_Lite->get($id)) {

    
// Cache hit !
    // Content is in $data
    // (...)

} else { // No valid cache found (you have to make the page)

    // Cache miss !
    // Put in $data datas to put in cache
    // (...)
    
$Cache_Lite->save($data);

}

?>

Wenn Sie den Cache blockweise benutzen wollen und nicht global, schauen Sie dieses Skript an:

<?php
require_once('Cache/Lite.php');

$options = array(
    
'cacheDir' => '/tmp/',
    
'lifeTime' => 3600
);

// Create a Cache_Lite object
$Cache_Lite = new Cache_Lite($options);

if (
$data $Cache_Lite->get('block1')) {
    echo(
$data);
} else {
    
$data 'Data of the block 1';
    
$Cache_Lite->save($data);
}

echo(
'<br><br>Non cached line !<br><br>');

if (
$data $Cache_Lite->get('block2')) {
    echo(
$data);
} else {
    
$data 'Data of the block 2';
    
$Cache_Lite->save($data);
}

?>

Kern

Wie auch immer, es ist nicht immer sinnvoll, den vollständigen Seiteninhalt in einer einzigen String-Variable zu speichern. So hilft Ihnen PEAR::Cache_Lite_Output:

<?php

require_once('Cache/Lite/Output.php');

$options = array(
    
'cacheDir' => '/tmp/',
    
'lifeTime' => 10
);

$cache = new Cache_Lite_Output($options);

if (!(
$cache->start('123'))) {
    
// Cache missed...
    
for($i=0;$i<1000;$i++) { // Making of the page...
        
echo('0123456789');
    }
    
$cache->end();
}

?>

Genauso kann Sie auch blockweise benutzt werden:

<?php

require_once('Cache/Lite/Output.php');

$options = array(
    
'cacheDir' => '/tmp/',
    
'lifeTime' => 10
);

$cache = new Cache_Lite_Output($options);

if (!(
$cache->start('block1'))) {
    
// Cache missed...
    
echo('Data of the block 1 !');
    
$cache->end();
}

echo(
'Non cached line !');

if (!(
$cache->start('block2'))) {
    
// Cache missed...
    
echo('Data of the block 2 !');
    
$cache->end();
}

?>

Wichtige Anmerkung

Für die maximale Effizenz sollten Sie nicht systematisch alle anderen Packages in Ihrer Seite laden. Laden Sie die Packages NUR dann, wenn sich die Seite nicht im Cache befindet und neu erzeugt werden muss.

Der schlechte Weg:

<?php
   
require_once("Cache/Lite.php");
   require_once(
"...")
   require_once(
"...")
   
// (...)
   
$cache = new Cache_Lite();
   if (
$data $Cache_Lite->get($id)) { // cache hit !
       
echo($data);
   } else { 
// page has to be (re)constructed in $data
       // (...)
       
$Cache_Lite->save($data);
   }
?>

Der gute Weg (teilweise doppelt so schnell):

<?php
   
require_once("Cache/Lite.php");
   
// (...)
   
$cache = new Cache_Lite();
   if (
$data $Cache_Lite->get($id)) { // cache hit !
       
echo($data);
   } else { 
// page has to be (re)constructed in $data
       
require_once("...")
       require_once(
"...")
       
// (...)
       
$Cache_Lite->save($data);
   }
?>

Abschluß

Um mehr über PEAR::Cache_Lite_Output zu erfahren, werfen Sie eine Blick in die Beispiele und technischen Erklärungen, die sich im Package befinden.

Cache_Lite (Previous) Constructor (Next)
Last updated: Sun, 19 Dec 2010 — Download Documentation
Do you think that something on this page is wrong? Please file a bug report or add a note.
View this page in:

User Notes:

Note by: joei007 at gmail dot com
Hi, andrea@gianfreda.com

You should remove cache associate with your data update to database.

mysql_query('update blah blah....');
$cache->remove('id_of_content');

or

wait until cache expire.
Note by: andrea@gianfreda.com
Hi,

i would like to ask you how to force the generation of cache files with a trigger: for example, i update a table in a database. A cached content is yet active, but i would like to refresh it. How can i do it with cache_lite?

Thanks,
Andrea