Función manipuladora de cache

Como una alternativa al uso del mecanismo de caching por default basado en archivo, usted puede especificar una función habitual de manipulación de cache que será usada para leer, escribir y limpar archivos de cache.

Cree una función en su aplicación para que Smarty la use como un manipulador de cache. Defina el nombre de la variable de clase en el $cache_handler_func. El Smarty ahora usara esta para manipular datos en el cache. El primer parámetro es la acción, que puede ser uno de estos 'read', 'write' y 'clear'. El segundo parámetro es el objeto de Smarty. El tercer parámetro es el contenido que esta en el cache. Sobre 'write', el Smarty pasa el contenido en cache en estos parámetros. sobre 'read', el Smarty espera que su función acepte este parámetro por referencia y poblar estos con los datos en cache. Sobre 'clear', el Smarty pasa una variable en cero desde aquí que esta no es usada. El cuarto parámetro es el nombre del archivo de template(necesario para leer/escribir). El quinto parámetro es la cache_id (opcional). El sexto parámetro es la compile_id (opcional).

NOTA: El ultimo parámetro ($exp_time) fue adicionado en el Smarty-2.6.0.

Ejemplo 15-5. ejemplo usando MySQL como una fuente de cache

<?php
/*

ejemplo de uso:

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;
    
}

?>