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 optional $cache_id .
The sixth is the optional
$compile_id .
The seventh and 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 ; } ?>