From 27928ece9ce517c93cd0e7a327eaa353eb467a11 Mon Sep 17 00:00:00 2001 From: uwetews Date: Wed, 23 Nov 2016 17:12:38 +0100 Subject: [PATCH] - move template object cache into static variables --- change_log.txt | 7 ++- libs/Smarty.class.php | 17 ++++---- libs/sysplugins/smarty_internal_template.php | 43 ++++++++++++++----- .../smarty_internal_templatebase.php | 6 +-- 4 files changed, 49 insertions(+), 24 deletions(-) diff --git a/change_log.txt b/change_log.txt index 6dd8c150..b6bf544f 100644 --- a/change_log.txt +++ b/change_log.txt @@ -1,5 +1,8 @@ -===== 3.1.31-dev ===== (xx.xx.xx) - 19.11.2016 +===== 3.1.31 ===== (23.11.2016) + 23.11.2016 + - move template object cache into static variables + + 19.11.2016 - bugfix inheritance root child templates containing nested {block}{/block} could call sub-bock content from parent template https://github.com/smarty-php/smarty/issues/317 - change version checking diff --git a/libs/Smarty.class.php b/libs/Smarty.class.php index ee93082d..080f2566 100644 --- a/libs/Smarty.class.php +++ b/libs/Smarty.class.php @@ -108,7 +108,7 @@ class Smarty extends Smarty_Internal_TemplateBase /** * smarty version */ - const SMARTY_VERSION = '3.1.31-dev/46'; + const SMARTY_VERSION = '3.1.31-dev/47'; /** * define variable scopes @@ -746,6 +746,7 @@ class Smarty extends Smarty_Internal_TemplateBase */ public function __construct() { + $this->_clearTemplateCache(); parent::__construct(); if (is_callable('mb_internal_encoding')) { mb_internal_encoding(Smarty::$_CHARSET); @@ -1111,13 +1112,13 @@ class Smarty extends Smarty_Internal_TemplateBase } $_templateId = $this->_getTemplateId($template, $cache_id, $compile_id); $tpl = null; - if ($this->caching && isset($this->_cache[ 'isCached' ][ $_templateId ])) { - $tpl = $do_clone ? clone $this->_cache[ 'isCached' ][ $_templateId ] : - $this->_cache[ 'isCached' ][ $_templateId ]; + if ($this->caching && isset(Smarty_Internal_Template::$isCacheTplObj[ $_templateId ])) { + $tpl = $do_clone ? clone Smarty_Internal_Template::$isCacheTplObj[ $_templateId ] : + Smarty_Internal_Template::$isCacheTplObj[ $_templateId ]; $tpl->inheritance = null; $tpl->tpl_vars = $tpl->config_vars = array(); - } else if (!$do_clone && isset($this->_cache[ 'tplObjects' ][ $_templateId ])) { - $tpl = clone $this->_cache[ 'tplObjects' ][ $_templateId ]; + } else if (!$do_clone && isset(Smarty_Internal_Template::$tplObjCache[ $_templateId ])) { + $tpl = clone Smarty_Internal_Template::$tplObjCache[ $_templateId ]; $tpl->inheritance = null; $tpl->tpl_vars = $tpl->config_vars = array(); } else { @@ -1248,8 +1249,8 @@ class Smarty extends Smarty_Internal_TemplateBase */ public function _clearTemplateCache() { - $this->_cache[ 'isCached' ] = array(); - $this->_cache[ 'tplObjects' ] = array(); + Smarty_Internal_Template::$isCacheTplObj = array(); + Smarty_Internal_Template::$tplObjCache = array(); } /** diff --git a/libs/sysplugins/smarty_internal_template.php b/libs/sysplugins/smarty_internal_template.php index 8545740e..f950606d 100644 --- a/libs/sysplugins/smarty_internal_template.php +++ b/libs/sysplugins/smarty_internal_template.php @@ -102,6 +102,27 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase */ public $endRenderCallbacks = array(); + /** + * Template object cache + * + * @var Smarty_Internal_Template[] + */ + public static $tplObjCache = array(); + + /** + * Template object cache for Smarty::isCached() == true + * + * @var Smarty_Internal_Template[] + */ + public static $isCacheTplObj = array(); + + /** + * Subtemplate Info Cache + * + * @var string[]int[] + */ + public static $subTplInfo = array(); + /** * Create template data object * Some of the global Smarty settings copied to template scope @@ -259,9 +280,9 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase // recursive call ? if (isset($tpl->templateId) ? $tpl->templateId : $tpl->_getTemplateId() != $_templateId) { // already in template cache? - if (isset($smarty->_cache[ 'tplObjects' ][ $_templateId ])) { + if (isset(self::$tplObjCache[ $_templateId ])) { // copy data from cached object - $cachedTpl = &$smarty->_cache[ 'tplObjects' ][ $_templateId ]; + $cachedTpl = &self::$tplObjCache[ $_templateId ]; $tpl->templateId = $cachedTpl->templateId; $tpl->template_resource = $cachedTpl->template_resource; $tpl->cache_id = $cachedTpl->cache_id; @@ -306,13 +327,13 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase $tpl->cache_lifetime = $cache_lifetime; // set template scope $tpl->scope = $scope; - if (!isset($smarty->_cache[ 'tplObjects' ][ $tpl->templateId ]) && !$tpl->source->handler->recompiled) { + if (!isset(self::$tplObjCache[ $tpl->templateId ]) && !$tpl->source->handler->recompiled) { // check if template object should be cached - if ($forceTplCache || (isset($smarty->_cache[ 'subTplInfo' ][ $tpl->template_resource ]) && - $smarty->_cache[ 'subTplInfo' ][ $tpl->template_resource ] > 1) || - ($tpl->_isSubTpl() && isset($smarty->_cache[ 'tplObjects' ][ $tpl->parent->templateId ])) + if ($forceTplCache || (isset(self::$subTplInfo[ $tpl->template_resource ]) && + self::$subTplInfo[ $tpl->template_resource ] > 1) || + ($tpl->_isSubTpl() && isset(self::$tplObjCache[ $tpl->parent->templateId ])) ) { - $smarty->_cache[ 'tplObjects' ][ $tpl->templateId ] = $tpl; + self::$tplObjCache[ $tpl->templateId ] = $tpl; } } @@ -360,10 +381,10 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase public function _subTemplateRegister() { foreach ($this->compiled->includes as $name => $count) { - if (isset($this->smarty->_cache[ 'subTplInfo' ][ $name ])) { - $this->smarty->_cache[ 'subTplInfo' ][ $name ] += $count; + if (isset(self::$subTplInfo[ $name ])) { + self::$subTplInfo[ $name ] += $count; } else { - $this->smarty->_cache[ 'subTplInfo' ][ $name ] = $count; + self::$subTplInfo[ $name ] = $count; } } } @@ -430,7 +451,7 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase } $is_valid = true; if (!empty($properties[ 'file_dependency' ]) && - ((!$cache && $tpl->smarty->compile_check) || $tpl->smarty->compile_check == 1) + ((!$cache && $tpl->smarty->compile_check) || $tpl->smarty->compile_check == 1) ) { // check file dependencies at compiled code foreach ($properties[ 'file_dependency' ] as $_file_to_check) { diff --git a/libs/sysplugins/smarty_internal_templatebase.php b/libs/sysplugins/smarty_internal_templatebase.php index f44b1823..c026a664 100644 --- a/libs/sysplugins/smarty_internal_templatebase.php +++ b/libs/sysplugins/smarty_internal_templatebase.php @@ -199,7 +199,7 @@ abstract class Smarty_Internal_TemplateBase extends Smarty_Internal_Data $template->loadCached(); } $result = $template->cached->isCached($template); - $template->smarty->_cache[ 'isCached' ][ $template->_getTemplateId() ] = $template; + Smarty_Internal_Template::$isCacheTplObj[ $template->_getTemplateId() ] = $template; } else { return false; } @@ -219,10 +219,10 @@ abstract class Smarty_Internal_TemplateBase extends Smarty_Internal_Data $template->tpl_vars = $savedTplVars; $template->config_vars = $savedConfigVars; } else { - if (!$function && !isset($smarty->_cache[ 'tplObjects' ][ $template->templateId ])) { + if (!$function && !isset(Smarty_Internal_Template::$tplObjCache[ $template->templateId ])) { $template->parent = null; $template->tpl_vars = $template->config_vars = array(); - $smarty->_cache[ 'tplObjects' ][ $template->templateId ] = $template; + Smarty_Internal_Template::$tplObjCache[ $template->templateId ] = $template; } } }