diff --git a/change_log.txt b/change_log.txt index b1196934..0ab106f7 100644 --- a/change_log.txt +++ b/change_log.txt @@ -8,6 +8,7 @@ - optimize nocache hash processing - remove not really needed properties - optimize rendering + - move caching to Smarty::_cache 06.08.2015 - avoid possible circular object references caused by parser/lexer objects diff --git a/libs/Smarty.class.php b/libs/Smarty.class.php index 99cf5152..4cf43f45 100644 --- a/libs/Smarty.class.php +++ b/libs/Smarty.class.php @@ -570,20 +570,6 @@ class Smarty extends Smarty_Internal_TemplateBase */ public $default_config_type = 'file'; - /** - * cached template objects - * - * @var array - */ - public $source_objects = array(); - - /** - * cached template objects - * - * @var array - */ - public $template_objects = array(); - /** * enable resource caching * @@ -633,13 +619,6 @@ class Smarty extends Smarty_Internal_TemplateBase */ public $registered_resources = array(); - /** - * resource handler cache - * - * @var array - */ - public $_resource_handlers = array(); - /** * registered cache resources * @@ -647,13 +626,6 @@ class Smarty extends Smarty_Internal_TemplateBase */ public $registered_cache_resources = array(); - /** - * cache resource handler cache - * - * @var array - */ - public $_cacheresource_handlers = array(); - /** * autoload filter * @@ -766,11 +738,11 @@ class Smarty extends Smarty_Internal_TemplateBase public function templateExists($resource_name) { // create template object - $save = $this->template_objects; + $save = $this->_cache['template_objects']; $tpl = new $this->template_class($resource_name, $this); // check if it does exists $result = $tpl->source->exists; - $this->template_objects = $save; + $this->_cache['template_objects'] = $save; return $result; } diff --git a/libs/sysplugins/smarty_cacheresource.php b/libs/sysplugins/smarty_cacheresource.php index 36008b9e..46891ae9 100644 --- a/libs/sysplugins/smarty_cacheresource.php +++ b/libs/sysplugins/smarty_cacheresource.php @@ -185,14 +185,14 @@ abstract class Smarty_CacheResource } // try smarty's cache - if (isset($smarty->_cacheresource_handlers[$type])) { - return $smarty->_cacheresource_handlers[$type]; + if (isset($smarty->_cache['cacheresource_handlers'][$type])) { + return $smarty->_cache['cacheresource_handlers'][$type]; } // try registered resource if (isset($smarty->registered_cache_resources[$type])) { // do not cache these instances as they may vary from instance to instance - return $smarty->_cacheresource_handlers[$type] = $smarty->registered_cache_resources[$type]; + return $smarty->_cache['cacheresource_handlers'][$type] = $smarty->registered_cache_resources[$type]; } // try sysplugins dir if (isset(self::$sysplugins[$type])) { @@ -200,12 +200,12 @@ abstract class Smarty_CacheResource if (!class_exists($cache_resource_class, false)) { require SMARTY_SYSPLUGINS_DIR . self::$sysplugins[$type]; } - return $smarty->_cacheresource_handlers[$type] = new $cache_resource_class(); + return $smarty->_cache['cacheresource_handlers'][$type] = new $cache_resource_class(); } // try plugins dir $cache_resource_class = 'Smarty_CacheResource_' . ucfirst($type); if ($smarty->loadPlugin($cache_resource_class)) { - return $smarty->_cacheresource_handlers[$type] = new $cache_resource_class(); + return $smarty->_cache['cacheresource_handlers'][$type] = new $cache_resource_class(); } // give up throw new SmartyException("Unable to load cache resource '{$type}'"); @@ -218,7 +218,7 @@ abstract class Smarty_CacheResource */ public static function invalidLoadedCache(Smarty $smarty) { - foreach ($smarty->template_objects as $tpl) { + foreach ($smarty->_cache['template_objects'] as $tpl) { if (isset($tpl->cached)) { $tpl->cached->valid = false; $tpl->cached->processed = false; diff --git a/libs/sysplugins/smarty_cacheresource_custom.php b/libs/sysplugins/smarty_cacheresource_custom.php index 4521daab..a7134689 100644 --- a/libs/sysplugins/smarty_cacheresource_custom.php +++ b/libs/sysplugins/smarty_cacheresource_custom.php @@ -220,9 +220,9 @@ abstract class Smarty_CacheResource_Custom extends Smarty_CacheResource return 0; } // remove from template cache - foreach ($smarty->template_objects as $key => $_tpl) { + foreach ($smarty->_cache['template_objects'] as $key => $_tpl) { if (isset($_tpl->cached) && $_tpl->source->uid == $tpl->source->uid) { - unset($smarty->template_objects[$key]); + unset($smarty->_cache['template_objects'][$key]); } } } diff --git a/libs/sysplugins/smarty_cacheresource_keyvaluestore.php b/libs/sysplugins/smarty_cacheresource_keyvaluestore.php index c8608379..428fe2dc 100644 --- a/libs/sysplugins/smarty_cacheresource_keyvaluestore.php +++ b/libs/sysplugins/smarty_cacheresource_keyvaluestore.php @@ -165,9 +165,9 @@ abstract class Smarty_CacheResource_KeyValueStore extends Smarty_CacheResource $this->invalidate(null); } // remove from template cache - foreach ($smarty->template_objects as $key => $tpl) { + foreach ($smarty->_cache['template_objects'] as $key => $tpl) { if (isset($tpl->cached)) { - unset($smarty->template_objects[$key]); + unset($smarty->_cache['template_objects'][$key]); } } return - 1; @@ -196,9 +196,9 @@ abstract class Smarty_CacheResource_KeyValueStore extends Smarty_CacheResource $this->delete(array($cid)); $this->invalidate($cid, $resource_name, $cache_id, $compile_id, $uid); // remove from template cache - foreach ($smarty->template_objects as $key => $tpl) { + foreach ($smarty->_cache['template_objects'] as $key => $tpl) { if ($tpl->source->uid == $uid && isset($tpl->cached)) { - unset($smarty->template_objects[$key]); + unset($smarty->_cache['template_objects'][$key]); } } return - 1; @@ -217,7 +217,7 @@ abstract class Smarty_CacheResource_KeyValueStore extends Smarty_CacheResource protected function getTemplateUid(Smarty $smarty, $resource_name) { if (isset($resource_name)) { - $source = Smarty_Template_Source::load(null, $smarty, $resource_name); + $source = new Smarty_Template_Source(null, $smarty, $resource_name); if ($source->exists) { return $source->uid; } diff --git a/libs/sysplugins/smarty_internal_extension_clear.php b/libs/sysplugins/smarty_internal_extension_clear.php index fdd04672..26192016 100644 --- a/libs/sysplugins/smarty_internal_extension_clear.php +++ b/libs/sysplugins/smarty_internal_extension_clear.php @@ -112,9 +112,9 @@ class Smarty_Internal_Extension_Clear } } // remove from template cache - foreach ($smarty->template_objects as $key => $tpl) { + foreach ($smarty->_cache['template_objects'] as $key => $tpl) { if (isset($tpl->cached) && $tpl->cached->filepath == $_file) { - unset($smarty->template_objects[$key]); + unset($smarty->_cache['template_objects'][$key]); } } $_count += @unlink((string) $_file) ? 1 : 0; diff --git a/libs/sysplugins/smarty_internal_method_clearcompiledtemplate.php b/libs/sysplugins/smarty_internal_method_clearcompiledtemplate.php index 6f18bf36..ed579165 100644 --- a/libs/sysplugins/smarty_internal_method_clearcompiledtemplate.php +++ b/libs/sysplugins/smarty_internal_method_clearcompiledtemplate.php @@ -50,9 +50,9 @@ class Smarty_Internal_Method_ClearCompiledTemplate // remove from compileds cache $tpl->source->compileds = array(); // remove from template cache - $_templateId = $tpl->getTemplateId($resource_name); - if (isset($smarty->template_objects[$_templateId])) { - unset($smarty->template_objects[$_templateId]); + $_templateId = $tpl->smarty->_getTemplateId($resource_name); + if (isset($smarty->_cache['template_objects'][$_templateId])) { + unset($smarty->_cache['template_objects'][$_templateId]); } $_resource_part_1 = basename(str_replace('^', DS, $tpl->compiled->filepath)); $_resource_part_1_length = strlen($_resource_part_1); @@ -116,8 +116,8 @@ class Smarty_Internal_Method_ClearCompiledTemplate } } // clear compiled cache - if (!isset($resource_name)) { - foreach ($smarty->source_objects as $source) { + if (!isset($resource_name) && isset($smarty->_cache['source_objects'])) { + foreach ($smarty->_cache['source_objects'] as $source) { $source->compileds = array(); } } diff --git a/libs/sysplugins/smarty_internal_method_compilealltemplates.php b/libs/sysplugins/smarty_internal_method_compilealltemplates.php index 6e29fc34..685fc0c0 100644 --- a/libs/sysplugins/smarty_internal_method_compilealltemplates.php +++ b/libs/sysplugins/smarty_internal_method_compilealltemplates.php @@ -98,7 +98,7 @@ class Smarty_Internal_Method_CompileAllTemplates } // free memory unset($_tpl); - $_smarty->template_objects = array(); + $_smarty->_cache['template_objects'] = array(); if ($max_errors !== null && $_error_count == $max_errors) { echo "\n

too many errors\n"; exit(); diff --git a/libs/sysplugins/smarty_internal_template.php b/libs/sysplugins/smarty_internal_template.php index 23b7aebd..423ac67a 100644 --- a/libs/sysplugins/smarty_internal_template.php +++ b/libs/sysplugins/smarty_internal_template.php @@ -205,11 +205,11 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase if (!$this->smarty->debugging && $this->smarty->debugging_ctrl == 'URL') { $this->smarty->_debug->debugUrl($this); } - if ($this->source->uncompiled) { + if ($this->source->handler->uncompiled) { $this->source->render($this); } else { // disable caching for evaluated code - if ($this->source->recompiled) { + if ($this->source->handler->recompiled) { $this->caching = false; } // read from cache or render @@ -491,11 +491,11 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase */ public function cacheTpl($cache_tpl_obj) { - if (!$this->source->handler->recompiled && (isset($this->smarty->template_objects[$this->parent->templateId]) || + if (!$this->source->handler->recompiled && (isset($this->smarty->_cache['template_objects'][$this->parent->templateId]) || ($cache_tpl_obj && $this->smarty->resource_cache_mode & Smarty::RESOURCE_CACHE_AUTOMATIC) || $this->smarty->resource_cache_mode & Smarty::RESOURCE_CACHE_ON) ) { - $this->smarty->->template_objects[$tpl->templateId] = $this; + $this->smarty->_cache['template_objects'][$this->templateId] = $this; } } diff --git a/libs/sysplugins/smarty_template_compiled.php b/libs/sysplugins/smarty_template_compiled.php index 69da4f0f..74e5a28b 100644 --- a/libs/sysplugins/smarty_template_compiled.php +++ b/libs/sysplugins/smarty_template_compiled.php @@ -154,7 +154,7 @@ class Smarty_Template_Compiled extends Smarty_Template_Resource_Base $_template->smarty->compile_check = $compileCheck; } } - if (!$_template->source->isConfig && !isset($_template->smarty->template_objects[$_template->templateId]) && + if (!isset($_template->smarty->_cache['template_objects'][$_template->templateId]) && $_template->smarty->resource_cache_mode & Smarty::RESOURCE_CACHE_AUTOMATIC && $_template->parent instanceof Smarty_Internal_Template && isset($_template->parent->compiled) ) { @@ -163,7 +163,7 @@ class Smarty_Template_Compiled extends Smarty_Template_Resource_Base $count : $count; } if (!in_array($_template->source->type, array('eval', 'string')) && $_template->compiled->includes[$_template->source->type . ':' . $_template->source->name] > 1) { - $_template->smarty->template_objects[$_template->templateId] = $_template; + $_template->smarty->_cache['template_objects'][$_template->templateId] = $_template; } } $this->processed = true; diff --git a/libs/sysplugins/smarty_template_source.php b/libs/sysplugins/smarty_template_source.php index ac38e115..f70dd256 100644 --- a/libs/sysplugins/smarty_template_source.php +++ b/libs/sysplugins/smarty_template_source.php @@ -98,14 +98,14 @@ class Smarty_Template_Source /** * The Components an extended template is made of * - * @var array + * @var \Smarty_Resource */ public $components = null; /** * Resource Handler * - * @var Smarty_Resource + * @var \Smarty_Resource|\Smarty_Resource_Uncompiled|\Smarty_Resource_Recompiled */ public $handler = null; @@ -200,39 +200,40 @@ class Smarty_Template_Source } // parse resource_name, load resource handler, identify unique resource name list($name, $type) = Smarty_Resource::parseResourceName($template_resource, $smarty->default_resource_type); - $resource = Smarty_Resource::load($smarty, $type); + + $handler = Smarty_Resource::load($smarty, $type); // if resource is not recompiling and resource name is not dotted we can check the source cache - if (($smarty->resource_cache_mode & Smarty::RESOURCE_CACHE_ON) && !$resource->recompiled && + if (($smarty->resource_cache_mode & Smarty::RESOURCE_CACHE_ON) && !$handler->recompiled && !(isset($name[1]) && $name[0] == '.' && ($name[1] == '.' || $name[1] == '/')) ) { - $unique_resource = $resource->buildUniqueResourceName($smarty, $name); - if (isset($smarty->source_objects[$unique_resource])) { - return $smarty->source_objects[$unique_resource]; + $unique_resource = $handler->buildUniqueResourceName($smarty, $name); + if (isset($smarty->_cache['source_objects'][$unique_resource])) { + return $smarty->_cache['source_objects'][$unique_resource]; } } else { $unique_resource = null; } // create new source object - $source = new Smarty_Template_Source($resource, $smarty, $template_resource, $type, $name); - $resource->populate($source, $_template); + $source = new Smarty_Template_Source($handler, $smarty, $template_resource, $type, $name); + $handler->populate($source, $_template); if (!$source->exists && isset($_template->smarty->default_template_handler_func)) { Smarty_Internal_Method_RegisterDefaultTemplateHandler::_getDefaultTemplate($source); } // on recompiling resources we are done - if (($smarty->resource_cache_mode & Smarty::RESOURCE_CACHE_ON) && !$resource->recompiled) { + if (($smarty->resource_cache_mode & Smarty::RESOURCE_CACHE_ON) && !$handler->recompiled) { // may by we have already $unique_resource $is_relative = false; if (!isset($unique_resource)) { $is_relative = isset($name[1]) && $name[0] == '.' && ($name[1] == '.' || $name[1] == '/') && ($type == 'file' || (isset($_template->parent->source) && $_template->parent->source->type == 'extends')); - $unique_resource = $resource->buildUniqueResourceName($smarty, $is_relative ? $source->filepath . + $unique_resource = $handler->buildUniqueResourceName($smarty, $is_relative ? $source->filepath . $name : $name); } $source->unique_resource = $unique_resource; // save in runtime cache if not relative if (!$is_relative) { - $smarty->source_objects[$unique_resource] = $source; + $smarty->_cache['source_objects'][$unique_resource] = $source; } } return $source;