- optimization clear compiled and cached folder completely on detected version change

This commit is contained in:
uwetews
2016-09-19 14:59:49 +02:00
parent 8835408e0d
commit a9e7e8881e
5 changed files with 46 additions and 12 deletions

View File

@@ -1,4 +1,7 @@
===== 3.1.31-dev ===== (xx.xx.xx) ===== 3.1.31-dev ===== (xx.xx.xx)
19.09.2016
- optimization clear compiled and cached folder completely on detected version change
15.09.2016 15.09.2016
- bugfix assigning a variable in if condition by function like {if $value = array_shift($array)} the function got called twice https://github.com/smarty-php/smarty/issues/291 - bugfix assigning a variable in if condition by function like {if $value = array_shift($array)} the function got called twice https://github.com/smarty-php/smarty/issues/291
- bugfix function plugins called with assign attribute like {foo assign='bar'} did not output returned content because - bugfix function plugins called with assign attribute like {foo assign='bar'} did not output returned content because

View File

@@ -114,7 +114,7 @@ class Smarty extends Smarty_Internal_TemplateBase
/** /**
* smarty version * smarty version
*/ */
const SMARTY_VERSION = '3.1.31-dev/23'; const SMARTY_VERSION = '3.1.31-dev/24';
/** /**
* define variable scopes * define variable scopes
@@ -1005,6 +1005,9 @@ class Smarty extends Smarty_Internal_TemplateBase
if (!$this->_compileDirNormalized) { if (!$this->_compileDirNormalized) {
$this->_normalizeDir('compile_dir', $this->compile_dir); $this->_normalizeDir('compile_dir', $this->compile_dir);
$this->_compileDirNormalized = true; $this->_compileDirNormalized = true;
if ($this->_isNewRelease($this->compile_dir)) {
$this->clearCompiledTemplate();
}
} }
return $this->compile_dir; return $this->compile_dir;
} }
@@ -1033,6 +1036,9 @@ class Smarty extends Smarty_Internal_TemplateBase
if (!$this->_cacheDirNormalized) { if (!$this->_cacheDirNormalized) {
$this->_normalizeDir('cache_dir', $this->cache_dir); $this->_normalizeDir('cache_dir', $this->cache_dir);
$this->_cacheDirNormalized = true; $this->_cacheDirNormalized = true;
if ($this->_isNewRelease($this->cache_dir)) {
$this->clearAllCache();
}
} }
return $this->cache_dir; return $this->cache_dir;
} }
@@ -1246,6 +1252,22 @@ class Smarty extends Smarty_Internal_TemplateBase
$this->_cache[ 'tplObjects' ] = array(); $this->_cache[ 'tplObjects' ] = array();
} }
/**
* check if new release was installed
*
* @param string $dir compiled oder cache dir path
*
* @return bool
*/
public function _isNewRelease ($dir) {
if (!is_file($file = $dir. 'version.txt') || file_get_contents($file) !== Smarty::SMARTY_VERSION) {
file_put_contents($file, Smarty::SMARTY_VERSION);
return true;
} else {
return false;
}
}
/** /**
* Get Smarty object * Get Smarty object
* *

View File

@@ -63,9 +63,10 @@ class Smarty_Internal_Extension_Clear
$_cacheDirs = new RecursiveDirectoryIterator($_dir); $_cacheDirs = new RecursiveDirectoryIterator($_dir);
$_cache = new RecursiveIteratorIterator($_cacheDirs, RecursiveIteratorIterator::CHILD_FIRST); $_cache = new RecursiveIteratorIterator($_cacheDirs, RecursiveIteratorIterator::CHILD_FIRST);
foreach ($_cache as $_file) { foreach ($_cache as $_file) {
if (substr(basename($_file->getPathname()), 0, 1) == '.' || strpos($_file, '.svn') !== false) { if (substr(basename($_file->getPathname()), 0, 1) == '.') {
continue; continue;
} }
$_filepath = (string) $_file;
// directory ? // directory ?
if ($_file->isDir()) { if ($_file->isDir()) {
if (!$_cache->isDot()) { if (!$_cache->isDot()) {
@@ -73,7 +74,11 @@ class Smarty_Internal_Extension_Clear
@rmdir($_file->getPathname()); @rmdir($_file->getPathname());
} }
} else { } else {
$_parts = explode($_dir_sep, str_replace('\\', '/', substr((string) $_file, $_dir_length))); // delete only php files
if (substr($_filepath, -4) !== '.php') {
continue;
}
$_parts = explode($_dir_sep, str_replace('\\', '/', substr($_filepath, $_dir_length)));
$_parts_count = count($_parts); $_parts_count = count($_parts);
// check name // check name
if (isset($resource_name)) { if (isset($resource_name)) {
@@ -114,9 +119,9 @@ class Smarty_Internal_Extension_Clear
} }
} }
} }
$_count += @unlink((string) $_file) ? 1 : 0; $_count += @unlink($_filepath) ? 1 : 0;
if (function_exists('opcache_invalidate') && strlen(ini_get("opcache.restrict_api")) < 1) { if (function_exists('opcache_invalidate') && strlen(ini_get("opcache.restrict_api")) < 1) {
opcache_invalidate((string) $_file, true); opcache_invalidate($_filepath, true);
} }
} }
} }

View File

@@ -75,18 +75,20 @@ class Smarty_Internal_Method_ClearCompiledTemplate
} }
$_compile = new RecursiveIteratorIterator($_compileDirs, RecursiveIteratorIterator::CHILD_FIRST); $_compile = new RecursiveIteratorIterator($_compileDirs, RecursiveIteratorIterator::CHILD_FIRST);
foreach ($_compile as $_file) { foreach ($_compile as $_file) {
if (substr(basename($_file->getPathname()), 0, 1) == '.' || strpos($_file, '.svn') !== false) { if (substr(basename($_file->getPathname()), 0, 1) == '.') {
continue; continue;
} }
$_filepath = (string) $_file; $_filepath = (string) $_file;
if ($_file->isDir()) { if ($_file->isDir()) {
if (!$_compile->isDot()) { if (!$_compile->isDot()) {
// delete folder if empty // delete folder if empty
@rmdir($_file->getPathname()); @rmdir($_file->getPathname());
} }
} else { } else {
// delete only php files
if (substr($_filepath, -4) !== '.php') {
continue;
}
$unlink = false; $unlink = false;
if ((!isset($_compile_id) || (isset($_filepath[ $_compile_id_part_length ]) && $a = if ((!isset($_compile_id) || (isset($_filepath[ $_compile_id_part_length ]) && $a =
!strncmp($_filepath, $_compile_id_part, $_compile_id_part_length))) && !strncmp($_filepath, $_compile_id_part, $_compile_id_part_length))) &&

View File

@@ -419,11 +419,13 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase
*/ */
public function _decodeProperties(Smarty_Internal_Template $tpl, $properties, $cache = false) public function _decodeProperties(Smarty_Internal_Template $tpl, $properties, $cache = false)
{ {
// on cache resources other than file check version stored in cache code
if ($cache && $tpl->smarty->caching_type !== 'file' && Smarty::SMARTY_VERSION !== $properties[ 'version' ]) {
$tpl->smarty->clearAllCache();
return false;
}
$is_valid = true; $is_valid = true;
if (Smarty::SMARTY_VERSION != $properties[ 'version' ]) { if (!empty($properties[ 'file_dependency' ]) &&
// new version must rebuild
$is_valid = false;
} elseif ($is_valid && !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 // check file dependencies at compiled code