What is Smarty?
Why use it?
Use Cases and Work Flow
Syntax Comparison
Template Inheritance
Best Practices
Crash Course
You may use the Smarty logo according to the trademark notice.
For sponsorship, advertising, news or other inquiries, contact us at:
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; } ?>