Cache Handler Function

Cache Handler Function

As an alternative to using the default file-based caching mechanism, you can specify a custom cache handling function that will be used to read, write and clear cached files.

Create a function in your application that Smarty will use as a cache handler. Set the name of it in the $cache_handler_func class variable. Smarty will now use this to handle cached data. The first argument is the action, which will be one of 'read', 'write' and 'clear'. The second parameter is the Smarty object. The third parameter is the cached content. Upon a write, Smarty passes the cached content in these parameters. Upon a 'read', Smarty expects your function to accept this parameter by reference and populate it with the cached data. Upon a 'clear', pass a dummy variable here since it is not used. The fourth parameter is the name of the template file (needed for read/write), the fifth parameter is the cache_id (optional), and the sixth is the compile_id (optional).

Note: The last parameter ($exp_time) was added in Smarty-2.6.0.

Example 15-5. example using MySQL as a cache source

<?php
/*

example usage:

include('Smarty.class.php');
include('mysql_cache_handler.php');

$smarty = new Smarty;
$smarty->cache_handler_func = 'mysql_cache_handler';

$smarty->display('index.tpl');


mysql database is expected in this format:
    
create database SMARTY_CACHE;

create table CACHE_PAGES(
CacheID char(32) PRIMARY KEY,
CacheContents MEDIUMTEXT NOT NULL
);

*/

function mysql_cache_handler($action, &$smarty_obj, &$cache_content$tpl_file=null$cache_id=null$compile_id=null$exp_time=null)
{
    
// set db host, user and pass here
    
$db_host 'localhost';
    
$db_user 'myuser';
    
$db_pass 'mypass';
    
$db_name 'SMARTY_CACHE';
    
$use_gzip false;
    
    
// create unique cache id
    
$CacheID md5($tpl_file.$cache_id.$compile_id);
    
    if(! 
$link mysql_pconnect($db_host$db_user$db_pass)) {
        
$smarty_obj->_trigger_error_msg("cache_handler: could not connect to database");
        return 
false;
    }
    
mysql_select_db($db_name);

    switch (
$action) {
        case 
'read':
            
// read cache from database
            
$results mysql_query("select CacheContents from CACHE_PAGES where CacheID='$CacheID'");
            if(!
$results) {
                
$smarty_obj->_trigger_error_msg("cache_handler: query failed.");            
            }
            
$row mysql_fetch_array($results,MYSQL_ASSOC);
            
            if(
$use_gzip && function_exists("gzuncompress")) {
                
$cache_content gzuncompress($row["CacheContents"]);
            } else {
                
$cache_content $row["CacheContents"];
            }
            
$return $results;
            break;
        case 
'write':
            
// save cache to database
            
            
if($use_gzip && function_exists("gzcompress")) {
                
// compress the contents for storage efficiency
                
$contents gzcompress($cache_content);
            } else {
                
$contents $cache_content;
            }
            
$results mysql_query("replace into CACHE_PAGES values(
                            '$CacheID',
                            '"
.addslashes($contents)."')
                        "
);
            if(!
$results) {
                
$smarty_obj->_trigger_error_msg("cache_handler: query failed.");            
            }
            
$return $results;
            break;
        case 
'clear':
            
// clear cache info
            
if(empty($cache_id) && empty($compile_id) && empty($tpl_file)) {
                
// clear them all
                
$results mysql_query("delete from CACHE_PAGES");            
            } else {
                
$results mysql_query("delete from CACHE_PAGES where CacheID='$CacheID'");            
            }
            if(!
$results) {
                
$smarty_obj->_trigger_error_msg("cache_handler: query failed.");            
            }
            
$return $results;
            break;
        default:
            
// error, unknown action
            
$smarty_obj->_trigger_error_msg("cache_handler: unknown action \"$action\"");
            
$return false;
            break;
    }
    
mysql_close($link);
    return 
$return;
    
}

?>
© Copyright 2003-2023 www.php-editors.com. The ultimate PHP Editor and PHP IDE site.