|
11.6. CachingPEAR 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_LiteThe 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 CachingFollowing 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. |
|