mirror of
https://github.com/smarty-php/smarty.git
synced 2025-08-07 11:54:26 +02:00
- added cache resource MYSQL plugin
This commit is contained in:
@@ -1,3 +1,6 @@
|
|||||||
|
11/27/2009
|
||||||
|
- added cache resource MYSQL plugin
|
||||||
|
|
||||||
11/26/2009
|
11/26/2009
|
||||||
- bugfix on nested doublequoted strings
|
- bugfix on nested doublequoted strings
|
||||||
- correct line number on unknown tag error message
|
- correct line number on unknown tag error message
|
||||||
|
@@ -62,7 +62,7 @@ if (!defined('SMARTY_RESOURCE_CHAR_SET')) {
|
|||||||
if (!defined('SMARTY_RESOURCE_DATE_FORMAT')) {
|
if (!defined('SMARTY_RESOURCE_DATE_FORMAT')) {
|
||||||
define('SMARTY_RESOURCE_DATE_FORMAT', '%b %e, %Y');
|
define('SMARTY_RESOURCE_DATE_FORMAT', '%b %e, %Y');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* define variable scopes
|
* define variable scopes
|
||||||
*/
|
*/
|
||||||
@@ -167,7 +167,7 @@ class Smarty extends Smarty_Internal_TemplateBase {
|
|||||||
// config var settings
|
// config var settings
|
||||||
public $config_overwrite = true; //Controls whether variables with the same name overwrite each other.
|
public $config_overwrite = true; //Controls whether variables with the same name overwrite each other.
|
||||||
public $config_booleanize = true; //Controls whether config values of on/true/yes and off/false/no get converted to boolean
|
public $config_booleanize = true; //Controls whether config values of on/true/yes and off/false/no get converted to boolean
|
||||||
public $config_read_hidden = true; //Controls whether hidden config sections/vars are read from the file.
|
public $config_read_hidden = true; //Controls whether hidden config sections/vars are read from the file.
|
||||||
// config vars
|
// config vars
|
||||||
public $config_vars = array();
|
public $config_vars = array();
|
||||||
// assigned tpl vars
|
// assigned tpl vars
|
||||||
@@ -181,9 +181,9 @@ class Smarty extends Smarty_Internal_TemplateBase {
|
|||||||
// resource type used if none given
|
// resource type used if none given
|
||||||
public $default_resource_type = 'file';
|
public $default_resource_type = 'file';
|
||||||
// caching type
|
// caching type
|
||||||
public $default_caching_type = 'file';
|
public $caching_type = 'file';
|
||||||
// internal cache resource types
|
// internal cache resource types
|
||||||
public $cache_resorce_types = array('file');
|
public $cache_resource_types = array('file');
|
||||||
// config type
|
// config type
|
||||||
public $default_config_type = 'file';
|
public $default_config_type = 'file';
|
||||||
// class used for cacher
|
// class used for cacher
|
||||||
@@ -331,7 +331,7 @@ class Smarty extends Smarty_Internal_TemplateBase {
|
|||||||
* @param object $parent next higher level of Smarty variables
|
* @param object $parent next higher level of Smarty variables
|
||||||
*/
|
*/
|
||||||
public function display($template, $cache_id = null, $compile_id = null, $parent = null)
|
public function display($template, $cache_id = null, $compile_id = null, $parent = null)
|
||||||
{
|
{
|
||||||
// display template
|
// display template
|
||||||
echo $this->fetch ($template, $cache_id, $compile_id, $parent);
|
echo $this->fetch ($template, $cache_id, $compile_id, $parent);
|
||||||
// debug output
|
// debug output
|
||||||
@@ -493,6 +493,34 @@ class Smarty extends Smarty_Internal_TemplateBase {
|
|||||||
return set_exception_handler($handler);
|
return set_exception_handler($handler);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loads cache resource.
|
||||||
|
*
|
||||||
|
* @return object of cache resource
|
||||||
|
*/
|
||||||
|
public function loadCacheResource($type = null)
|
||||||
|
{
|
||||||
|
if (!isset($type)) {
|
||||||
|
$type = $this->caching_type;
|
||||||
|
}
|
||||||
|
// already loaded?
|
||||||
|
if (isset($this->cache_resource_objects[$type])) {
|
||||||
|
return $this->cache_resource_objects[$type];
|
||||||
|
}
|
||||||
|
if (in_array($type, $this->cache_resource_types)) {
|
||||||
|
$cache_resource_class = 'Smarty_Internal_CacheResource_' . ucfirst($type);
|
||||||
|
return $this->cache_resource_objects[$type] = new $cache_resource_class($this);
|
||||||
|
} else {
|
||||||
|
// try plugins dir
|
||||||
|
$cache_resource_class = 'Smarty_CacheResource_' . ucfirst($type);
|
||||||
|
if ($this->loadPlugin($cache_resource_class)) {
|
||||||
|
return $this->cache_resource_objects[$type] = new $cache_resource_class($this);
|
||||||
|
} else {
|
||||||
|
throw new Exception("Unable to load cache resource '{$type}'");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* trigger Smarty error
|
* trigger Smarty error
|
||||||
*
|
*
|
||||||
|
191
libs/plugins/cacheresource.mysql.php
Normal file
191
libs/plugins/cacheresource.mysql.php
Normal file
@@ -0,0 +1,191 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty Plugin CacheResource Mysql
|
||||||
|
*
|
||||||
|
* Implements MYSQL as resource for the HTML cache
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage Plugins
|
||||||
|
* @author Uwe Tews
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class does contain all necessary methods for the HTML cache on MYSQL system
|
||||||
|
*/
|
||||||
|
class Smarty_CacheResource_Mysql {
|
||||||
|
// set db host, user and pass here
|
||||||
|
public $db_host = 'localhost';
|
||||||
|
public $db_user = 'root';
|
||||||
|
public $db_pass = '';
|
||||||
|
public $db_name = 'SMARTY';
|
||||||
|
|
||||||
|
function __construct($smarty)
|
||||||
|
{
|
||||||
|
$this->smarty = $smarty;
|
||||||
|
if (!$this->link = mysql_pconnect($this->db_host, $this->db_user, $this->db_pass)) {
|
||||||
|
throw new Exception("Cache resource unable to connect to MYSQL");
|
||||||
|
}
|
||||||
|
mysql_select_db($this->db_name, $this->link);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Returns the filepath of the cached template output
|
||||||
|
*
|
||||||
|
* @param object $template current template
|
||||||
|
* @return string the cache filepath
|
||||||
|
*/
|
||||||
|
public function getCachedFilepath($template)
|
||||||
|
{
|
||||||
|
return $this->buildCachedFilepath ($template->resource_name, $template->cache_id, $template->compile_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the timpestamp of the cached template output
|
||||||
|
*
|
||||||
|
* @param object $template current template
|
||||||
|
* @return integer |booelan the template timestamp or false if the file does not exist
|
||||||
|
*/
|
||||||
|
public function getCachedTimestamp($template)
|
||||||
|
{
|
||||||
|
$Id = $template->getCachedFilepath();
|
||||||
|
// read cache from database
|
||||||
|
$results = mysql_query("select UNIX_TIMESTAMP(Timestamp) from SMARTY_CACHE where Id='$Id'", $this->link);
|
||||||
|
if (!$results) {
|
||||||
|
$this->mysqlError();
|
||||||
|
}
|
||||||
|
$row = mysql_fetch_row($results);
|
||||||
|
return (int)$row[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the cached template output
|
||||||
|
*
|
||||||
|
* @param object $template current template
|
||||||
|
* @return string |booelan the template content or false if the file does not exist
|
||||||
|
*/
|
||||||
|
public function getCachedContents($template)
|
||||||
|
{
|
||||||
|
$Id = $template->getCachedFilepath();
|
||||||
|
// read cache from database
|
||||||
|
$results = mysql_query("select CacheContents from SMARTY_CACHE where Id='$Id'", $this->link);
|
||||||
|
if (!$results) {
|
||||||
|
$this->mysqlError();
|
||||||
|
}
|
||||||
|
$row = mysql_fetch_row($results);
|
||||||
|
|
||||||
|
$cache_content = $row[0];
|
||||||
|
|
||||||
|
$_smarty_tpl = $template;
|
||||||
|
ob_start();
|
||||||
|
eval("?>" . $cache_content);
|
||||||
|
return ob_get_clean();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes the rendered template output to cache file
|
||||||
|
*
|
||||||
|
* @param object $template current template
|
||||||
|
* @return boolean status
|
||||||
|
*/
|
||||||
|
public function writeCachedContent($template, $content)
|
||||||
|
{
|
||||||
|
if (!$template->isEvaluated()) {
|
||||||
|
$_cache_id = isset($template->cache_id) ? preg_replace('![^\w\|]+!', '_', $template->cache_id) : null;
|
||||||
|
$_compile_id = isset($template->compile_id) ? preg_replace('![^\w\|]+!', '_', $template->compile_id) : null;
|
||||||
|
// save cache to database
|
||||||
|
$Id = $template->getCachedFilepath();
|
||||||
|
$results = mysql_query("replace into SMARTY_CACHE set Id = $Id, CacheContents = '" . addslashes($content) . "',
|
||||||
|
CacheId = '$_cache_id',
|
||||||
|
CompileId = '$_compile_id',
|
||||||
|
ResourceName = '$template->resource_name'", $this->link);
|
||||||
|
if (!$results) {
|
||||||
|
$this->mysqlError();
|
||||||
|
}
|
||||||
|
return $results;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Empty cache folder
|
||||||
|
*
|
||||||
|
* @param integer $exp_time expiration time
|
||||||
|
* @return integer number of cache files deleted
|
||||||
|
*/
|
||||||
|
public function clearAll($exp_time = null)
|
||||||
|
{
|
||||||
|
if ($exp_time === null) {
|
||||||
|
$results = mysql_query("truncate table SMARTY_CACHE", $this->link);
|
||||||
|
} else {
|
||||||
|
$results = mysql_query("delete ignore from SMARTY_CACHE where UNIX_TIMESTAMP(Timestamp) <= '$exp_time'", $this->link);
|
||||||
|
}
|
||||||
|
if (!$results) {
|
||||||
|
$this->mysqlError();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Empty cache for a specific template
|
||||||
|
*
|
||||||
|
* @param string $resource_name template name
|
||||||
|
* @param string $cache_id cache id
|
||||||
|
* @param string $compile_id compile id
|
||||||
|
* @param integer $exp_time expiration time
|
||||||
|
* @return integer number of cache files deleted
|
||||||
|
*/
|
||||||
|
public function clear($resource_name, $cache_id, $compile_id, $exp_time)
|
||||||
|
{
|
||||||
|
$_cache_id = isset($cache_id) ? preg_replace('![^\w\|]+!', '_', $cache_id) : null;
|
||||||
|
$_compile_id = isset($compile_id) ? preg_replace('![^\w\|]+!', '_', $compile_id) : null;
|
||||||
|
|
||||||
|
$where = '';
|
||||||
|
$and = '';
|
||||||
|
if (isset($resource_name)) {
|
||||||
|
$where = "ResourceName = '$resource_name' ";
|
||||||
|
$and = 'and ';
|
||||||
|
}
|
||||||
|
if (isset($_cache_id)) {
|
||||||
|
$length = strlen($_cache_id);
|
||||||
|
$where .= $and . "SUBSTRING(CacheId,1,$length) = '$_cache_id' ";
|
||||||
|
$and = 'and ';
|
||||||
|
}
|
||||||
|
if (isset($_compile_id)) {
|
||||||
|
$where .= $and . "CompileId = '$_compile_id' ";
|
||||||
|
$and = 'and ';
|
||||||
|
}
|
||||||
|
if (isset($exp_time)) {
|
||||||
|
$where .= $and . "UNIX_TIMESTAMP(Timestamp) <= '$exp_time' ";
|
||||||
|
}
|
||||||
|
$results = mysql_query("delete ignore from SMARTY_CACHE where $where", $this->link);
|
||||||
|
if (!$results) {
|
||||||
|
$this->mysqlError();
|
||||||
|
}
|
||||||
|
return mysql_affected_rows();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get system filepath to cached file
|
||||||
|
*
|
||||||
|
* @param string $resource_name template name
|
||||||
|
* @param string $cache_id cache id
|
||||||
|
* @param string $compile_id compile id
|
||||||
|
* @return string filepath of cache file
|
||||||
|
*/
|
||||||
|
private function buildCachedFilepath ($resource_name, $cache_id, $compile_id)
|
||||||
|
{
|
||||||
|
$_cache_id = isset($cache_id) ? preg_replace('![^\w\|]+!', '_', $cache_id) : null;
|
||||||
|
$_compile_id = isset($compile_id) ? preg_replace('![^\w\|]+!', '_', $compile_id) : null;
|
||||||
|
return abs(crc32($resource_name . $_cache_id . $_compile_id));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MYSQL Error
|
||||||
|
*/
|
||||||
|
private function mysqlError ()
|
||||||
|
{
|
||||||
|
$error = mysql_error($this->link);
|
||||||
|
throw new Exception("Cache resource MYSQL error '{$error}'");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
@@ -24,7 +24,7 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase {
|
|||||||
public $cache_lifetime = null;
|
public $cache_lifetime = null;
|
||||||
public $cacher_class = null;
|
public $cacher_class = null;
|
||||||
public $caching_type = null;
|
public $caching_type = null;
|
||||||
public $force_compile = null;
|
public $force_compile = null;
|
||||||
public $forceNocache = false;
|
public $forceNocache = false;
|
||||||
// Template resource
|
// Template resource
|
||||||
public $template_resource = null;
|
public $template_resource = null;
|
||||||
@@ -87,9 +87,7 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase {
|
|||||||
$this->cache_lifetime = $_cache_lifetime === null ?$this->smarty->cache_lifetime : $_cache_lifetime;
|
$this->cache_lifetime = $_cache_lifetime === null ?$this->smarty->cache_lifetime : $_cache_lifetime;
|
||||||
$this->force_cache = $this->smarty->force_cache;
|
$this->force_cache = $this->smarty->force_cache;
|
||||||
$this->cacher_class = $this->smarty->cacher_class;
|
$this->cacher_class = $this->smarty->cacher_class;
|
||||||
$this->caching_type = $this->smarty->default_caching_type;
|
|
||||||
$this->security = $this->smarty->security;
|
$this->security = $this->smarty->security;
|
||||||
$this->cache_resource_class = 'Smarty_Internal_CacheResource_' . ucfirst($this->caching_type);
|
|
||||||
$this->parent = $_parent;
|
$this->parent = $_parent;
|
||||||
$this->properties['file_dependency'] = array();
|
$this->properties['file_dependency'] = array();
|
||||||
// dummy local smarty variable
|
// dummy local smarty variable
|
||||||
@@ -102,7 +100,7 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase {
|
|||||||
}
|
}
|
||||||
// load cache resource
|
// load cache resource
|
||||||
if (!$this->isEvaluated() && $this->caching) {
|
if (!$this->isEvaluated() && $this->caching) {
|
||||||
$this->cache_resource_object = new $this->cache_resource_class($this->smarty);
|
$this->cache_resource_object = $this->smarty->loadCacheResource();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -207,8 +205,8 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase {
|
|||||||
{
|
{
|
||||||
$this->isExisting(true);
|
$this->isExisting(true);
|
||||||
if ($this->mustCompile === null) {
|
if ($this->mustCompile === null) {
|
||||||
$this->mustCompile = ($this->usesCompiler() && ($this->force_compile || $this->isEvaluated() || $this->getCompiledTimestamp () === false ||
|
$this->mustCompile = ($this->usesCompiler() && ($this->force_compile || $this->isEvaluated() || $this->getCompiledTimestamp () === false ||
|
||||||
// ($this->smarty->compile_check && $this->getCompiledTimestamp () !== $this->getTemplateTimestamp ())));
|
// ($this->smarty->compile_check && $this->getCompiledTimestamp () !== $this->getTemplateTimestamp ())));
|
||||||
($this->smarty->compile_check && $this->getCompiledTimestamp () < $this->getTemplateTimestamp ())));
|
($this->smarty->compile_check && $this->getCompiledTimestamp () < $this->getTemplateTimestamp ())));
|
||||||
}
|
}
|
||||||
return $this->mustCompile;
|
return $this->mustCompile;
|
||||||
@@ -291,14 +289,14 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase {
|
|||||||
// write compiled template
|
// write compiled template
|
||||||
Smarty_Internal_Write_File::writeFile($this->getCompiledFilepath(), $this->compiled_template, $this->smarty);
|
Smarty_Internal_Write_File::writeFile($this->getCompiledFilepath(), $this->compiled_template, $this->smarty);
|
||||||
// make template and compiled file timestamp match
|
// make template and compiled file timestamp match
|
||||||
/**
|
/**
|
||||||
$this->compiled_timestamp = null;
|
* $this->compiled_timestamp = null;
|
||||||
touch($this->getCompiledFilepath(), $this->getTemplateTimestamp());
|
* touch($this->getCompiledFilepath(), $this->getTemplateTimestamp());
|
||||||
// daylight saving time problem on windows
|
* // daylight saving time problem on windows
|
||||||
if ($this->template_timestamp != $this->getCompiledTimestamp()) {
|
* if ($this->template_timestamp != $this->getCompiledTimestamp()) {
|
||||||
touch($this->getCompiledFilepath(), 2 * $this->template_timestamp - $this->compiled_timestamp);
|
* touch($this->getCompiledFilepath(), 2 * $this->template_timestamp - $this->compiled_timestamp);
|
||||||
}
|
* }
|
||||||
**/
|
*/
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// error compiling template
|
// error compiling template
|
||||||
@@ -445,7 +443,7 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase {
|
|||||||
$resource_handler = $this->loadTemplateResourceHandler($resource_type);
|
$resource_handler = $this->loadTemplateResourceHandler($resource_type);
|
||||||
$mtime = $resource_handler->getTemplateTimestampTypeName($resource_type, $resource_name);
|
$mtime = $resource_handler->getTemplateTimestampTypeName($resource_type, $resource_name);
|
||||||
}
|
}
|
||||||
// If ($mtime != $_file_to_check[1]) {
|
// If ($mtime != $_file_to_check[1]) {
|
||||||
If ($mtime > $_file_to_check[1]) {
|
If ($mtime > $_file_to_check[1]) {
|
||||||
$this->properties['file_dependency'] = array();
|
$this->properties['file_dependency'] = array();
|
||||||
$this->mustCompile = true;
|
$this->mustCompile = true;
|
||||||
@@ -577,7 +575,7 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase {
|
|||||||
return $_return;
|
return $_return;
|
||||||
} elseif ($_return === true) {
|
} elseif ($_return === true) {
|
||||||
return $file;
|
return $file;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// throw new Exception("Unable to load template \"{$file}\"");
|
// throw new Exception("Unable to load template \"{$file}\"");
|
||||||
|
@@ -18,18 +18,12 @@
|
|||||||
* @param string $type resource type
|
* @param string $type resource type
|
||||||
* @return integer number of cache files deleted
|
* @return integer number of cache files deleted
|
||||||
*/
|
*/
|
||||||
function Smarty_Method_Clear_All_Cache($smarty, $exp_time = null, $type = 'file')
|
function Smarty_Method_Clear_All_Cache($smarty, $exp_time = null, $type = null)
|
||||||
{
|
{
|
||||||
// load cache resource
|
// load cache resource
|
||||||
if (!isset($smarty->cache_resource_objects[$type])) {
|
$cacheResource = $smarty->loadCacheResource($type);
|
||||||
$_cache_resource_class = 'Smarty_Internal_CacheResource_' . $type;
|
|
||||||
if (!$smarty->loadPlugin($_cache_resource_class)) {
|
|
||||||
throw new Exception("Undefined cache resource type {$type}");
|
|
||||||
}
|
|
||||||
$smarty->cache_resource_objects[$type] = new $_cache_resource_class($smarty);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $smarty->cache_resource_objects[$type]->clearAll($exp_time);
|
return $cacheResource->clearAll($exp_time);
|
||||||
}
|
}
|
||||||
|
|
||||||
?>
|
?>
|
||||||
|
@@ -21,16 +21,12 @@
|
|||||||
* @param string $type resource type
|
* @param string $type resource type
|
||||||
* @return integer number of cache files deleted
|
* @return integer number of cache files deleted
|
||||||
*/
|
*/
|
||||||
function Smarty_Method_Clear_Cache($smarty, $template_name, $cache_id = null, $compile_id = null, $exp_time = null, $type = 'file')
|
function Smarty_Method_Clear_Cache($smarty, $template_name, $cache_id = null, $compile_id = null, $exp_time = null, $type = null)
|
||||||
{
|
{
|
||||||
// load cache resource
|
// load cache resource
|
||||||
$_cache_resource_class = 'Smarty_Internal_CacheResource_' . $type;
|
$cacheResource = $smarty->loadCacheResource($type);
|
||||||
if (!$smarty->loadPlugin($_cache_resource_class)) {
|
|
||||||
throw new Exception("Undefined cache resource type {$type}");
|
|
||||||
}
|
|
||||||
$cache_object = new $_cache_resource_class($smarty);
|
|
||||||
|
|
||||||
return $cache_object->clear($template_name, $cache_id, $compile_id, $exp_time);
|
return $cacheResource->clear($template_name, $cache_id, $compile_id, $exp_time);
|
||||||
}
|
}
|
||||||
|
|
||||||
?>
|
?>
|
||||||
|
Reference in New Issue
Block a user