11.6. Caching
PEAR offers two different packages for caching: Cache and Cache_Lite. As suggested by the name, Cache_Lite has a lighter design than Cache, and is designed to be faster at the expense of some flexibility and functionality.
11.6.1. Cache_Lite
The Cache_Lite package offers simple, fast, file-based caching. It is restricted to caching in files for speed and simplicity. Cache_Lite provides three types of caching:
The idea behind Cache_Lite is that you only need to load the Cache_Lite class to use it. It does not load the PEAR class unless needed in a raiseError() call, and not many other classes. If you are not using a PHP code cache, this package avoids compiling code you potentially will not execute, and keeps latency down.
11.6.1.1 Example: Output Caching
Following is an example of PHP output caching that serves the entire page from the cache:
<?php
require_once "Cache/Lite/Output.php";
$time_s = utime();
if (empty($_GET['id'])) {
die("please specify an article id!");
}
$cache = new Cache_Lite_Output(
array('lifeTime' => 300, // 5 minutes
'cacheDir' => '/tmp/article_cache/'));
if ($cache->start($_GET['id'], 'article')) {
$cached = true;
} else {
include_once "DB.php";
include_once "HTML/Template/Flexy.php";
$dbh = DB::connect("mysql://test@localhost/test");
$article = $dbh->getRow(
"SELECT * FROM articles WHERE id = ?",
array($_GET['id']), DB_FETCHMODE_OBJECT);
$dir = dirname(__FILE__);
$tpl = new HTML_Template_Flexy(
array('templateDir' => "$dir/templates",
'compileDir' => "$dir/templates/compiled",
'filters' => 'Php,SimpleTags,BodyOnly'));
$tpl->compile('flexy_display_article.tpl');
$tpl->outputObject($article);
$cache->end();
$cached = false;
}
$elapsed = utime() - $time_s;
printf("<div style=\"font-size:x-small\">".
"(spent %.1fms %s)</div>\n", $elapsed * 1000,
$cached ? "serving page from cache" : "generating page");
function utime() {
list($usec, $sec) = explode(" ", microtime());
return (double)$usec + $sec;
}
As you can see, this script only includes Cache/Lite/Output.php every time. If the page is served from a cache, no other code is loaded because DB.php and HTML/Template/Flexy.php are included only if there was no cache hit.
The $cache->start() looks up the requested entry in the cache. If it is found there and has not expired, the cached entry is printed, and the start() method returns TRue.
If a cache entry was not found, start() returns false. Then, the script connects to the database, pulls out the article, compiles a template, and displays the article. After all this, the $cache->end() call prints the output and stores it in the cache.
At the end, the cache output example displays a message to illustrate the response time difference with a cache hit.
![](images/pixel.gif) |