
Comparing changes: https://github.com/smarty-php/smarty/compare/v4.3.1...v4.4.1 It is noticeable that Smarty 4.3.1 does not officially support PHP 8.3. Is only supported with 4.4.0. Remark: During tests with Smarty 4.5.1, it was noticed that the following warning occurs: Deprecated: Using the unregistered function "function_exists" in a template is deprecated and will be removed in a future version. Use Smarty::registerPlugin to explicitly register a custom modifier. As of Smarty 5.X.X, templates must be revised again. The Smarty release 5.0.2 is already officially available. However, integration into FlatPress is not entirely trivial.
236 lines
7.9 KiB
PHP
236 lines
7.9 KiB
PHP
<?php
|
|
/**
|
|
* Smarty Internal Plugin CacheResource File
|
|
*
|
|
* @package Smarty
|
|
* @subpackage Cacher
|
|
* @author Uwe Tews
|
|
* @author Rodney Rehm
|
|
*/
|
|
|
|
/**
|
|
* This class does contain all necessary methods for the HTML cache on file system
|
|
* Implements the file system as resource for the HTML cache Version ussing nocache inserts.
|
|
*
|
|
* @package Smarty
|
|
* @subpackage Cacher
|
|
*/
|
|
class Smarty_Internal_CacheResource_File extends Smarty_CacheResource
|
|
{
|
|
/**
|
|
* populate Cached Object with meta data from Resource
|
|
*
|
|
* @param Smarty_Template_Cached $cached cached object
|
|
* @param Smarty_Internal_Template $_template template object
|
|
*
|
|
* @return void
|
|
*/
|
|
public function populate(Smarty_Template_Cached $cached, Smarty_Internal_Template $_template)
|
|
{
|
|
$source = &$_template->source;
|
|
$smarty = &$_template->smarty;
|
|
$_compile_dir_sep = $smarty->use_sub_dirs ? DIRECTORY_SEPARATOR : '^';
|
|
$_filepath = sha1($source->uid . $smarty->_joined_template_dir);
|
|
$cached->filepath = $smarty->getCacheDir();
|
|
if (isset($_template->cache_id)) {
|
|
$cached->filepath .= preg_replace(
|
|
array(
|
|
'![^\w|]+!',
|
|
'![|]+!'
|
|
),
|
|
array(
|
|
'_',
|
|
$_compile_dir_sep
|
|
),
|
|
$_template->cache_id
|
|
) . $_compile_dir_sep;
|
|
}
|
|
if (isset($_template->compile_id)) {
|
|
$cached->filepath .= preg_replace('![^\w]+!', '_', $_template->compile_id) . $_compile_dir_sep;
|
|
}
|
|
// if use_sub_dirs, break file into directories
|
|
if ($smarty->use_sub_dirs) {
|
|
$cached->filepath .= $_filepath[ 0 ] . $_filepath[ 1 ] . DIRECTORY_SEPARATOR . $_filepath[ 2 ] .
|
|
$_filepath[ 3 ] .
|
|
DIRECTORY_SEPARATOR .
|
|
$_filepath[ 4 ] . $_filepath[ 5 ] . DIRECTORY_SEPARATOR;
|
|
}
|
|
$cached->filepath .= $_filepath;
|
|
$basename = $source->handler->getBasename($source);
|
|
if (!empty($basename)) {
|
|
$cached->filepath .= '.' . $basename;
|
|
}
|
|
if ($smarty->cache_locking) {
|
|
$cached->lock_id = $cached->filepath . '.lock';
|
|
}
|
|
$cached->filepath .= '.php';
|
|
$cached->timestamp = $cached->exists = is_file($cached->filepath);
|
|
if ($cached->exists) {
|
|
$cached->timestamp = filemtime($cached->filepath);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* populate Cached Object with timestamp and exists from Resource
|
|
*
|
|
* @param Smarty_Template_Cached $cached cached object
|
|
*
|
|
* @return void
|
|
*/
|
|
public function populateTimestamp(Smarty_Template_Cached $cached)
|
|
{
|
|
$cached->timestamp = $cached->exists = is_file($cached->filepath);
|
|
if ($cached->exists) {
|
|
$cached->timestamp = filemtime($cached->filepath);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Read the cached template and process its header
|
|
*
|
|
* @param \Smarty_Internal_Template $_smarty_tpl do not change variable name, is used by compiled template
|
|
* @param Smarty_Template_Cached $cached cached object
|
|
* @param bool $update flag if called because cache update
|
|
*
|
|
* @return boolean true or false if the cached content does not exist
|
|
*/
|
|
public function process(
|
|
Smarty_Internal_Template $_smarty_tpl,
|
|
Smarty_Template_Cached $cached = null,
|
|
$update = false
|
|
) {
|
|
$_smarty_tpl->cached->valid = false;
|
|
if ($update && defined('HHVM_VERSION')) {
|
|
eval('?>' . file_get_contents($_smarty_tpl->cached->filepath));
|
|
return true;
|
|
} else {
|
|
return @include $_smarty_tpl->cached->filepath;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Write the rendered template output to cache
|
|
*
|
|
* @param Smarty_Internal_Template $_template template object
|
|
* @param string $content content to cache
|
|
*
|
|
* @return bool success
|
|
* @throws \SmartyException
|
|
*/
|
|
public function writeCachedContent(Smarty_Internal_Template $_template, $content)
|
|
{
|
|
if ($_template->smarty->ext->_writeFile->writeFile(
|
|
$_template->cached->filepath,
|
|
$content,
|
|
$_template->smarty
|
|
) === true
|
|
) {
|
|
if (function_exists('opcache_invalidate')
|
|
&& (!function_exists('ini_get') || strlen(ini_get('opcache.restrict_api'))) < 1
|
|
) {
|
|
opcache_invalidate($_template->cached->filepath, true);
|
|
} elseif (function_exists('apc_compile_file')) {
|
|
apc_compile_file($_template->cached->filepath);
|
|
}
|
|
$cached = $_template->cached;
|
|
$cached->timestamp = $cached->exists = is_file($cached->filepath);
|
|
if ($cached->exists) {
|
|
$cached->timestamp = filemtime($cached->filepath);
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Read cached template from cache
|
|
*
|
|
* @param Smarty_Internal_Template $_template template object
|
|
*
|
|
* @return string content
|
|
*/
|
|
public function readCachedContent(Smarty_Internal_Template $_template)
|
|
{
|
|
if (is_file($_template->cached->filepath)) {
|
|
return file_get_contents($_template->cached->filepath);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Empty cache
|
|
*
|
|
* @param Smarty $smarty
|
|
* @param integer $exp_time expiration time (number of seconds, not timestamp)
|
|
*
|
|
* @return integer number of cache files deleted
|
|
*/
|
|
public function clearAll(Smarty $smarty, $exp_time = null)
|
|
{
|
|
return $smarty->ext->_cacheResourceFile->clear($smarty, null, null, null, $exp_time);
|
|
}
|
|
|
|
/**
|
|
* Empty cache for a specific template
|
|
*
|
|
* @param Smarty $smarty
|
|
* @param string $resource_name template name
|
|
* @param string $cache_id cache id
|
|
* @param string $compile_id compile id
|
|
* @param integer $exp_time expiration time (number of seconds, not timestamp)
|
|
*
|
|
* @return integer number of cache files deleted
|
|
*/
|
|
public function clear(Smarty $smarty, $resource_name, $cache_id, $compile_id, $exp_time)
|
|
{
|
|
return $smarty->ext->_cacheResourceFile->clear($smarty, $resource_name, $cache_id, $compile_id, $exp_time);
|
|
}
|
|
|
|
/**
|
|
* Check is cache is locked for this template
|
|
*
|
|
* @param Smarty $smarty Smarty object
|
|
* @param Smarty_Template_Cached $cached cached object
|
|
*
|
|
* @return boolean true or false if cache is locked
|
|
*/
|
|
public function hasLock(Smarty $smarty, Smarty_Template_Cached $cached)
|
|
{
|
|
clearstatcache(true, $cached->lock_id ?? '');
|
|
if (null !== $cached->lock_id && is_file($cached->lock_id)) {
|
|
$t = filemtime($cached->lock_id);
|
|
return $t && (time() - $t < $smarty->locking_timeout);
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Lock cache for this template
|
|
*
|
|
* @param Smarty $smarty Smarty object
|
|
* @param Smarty_Template_Cached $cached cached object
|
|
*
|
|
* @return bool|void
|
|
*/
|
|
public function acquireLock(Smarty $smarty, Smarty_Template_Cached $cached)
|
|
{
|
|
$cached->is_locked = true;
|
|
touch($cached->lock_id);
|
|
}
|
|
|
|
/**
|
|
* Unlock cache for this template
|
|
*
|
|
* @param Smarty $smarty Smarty object
|
|
* @param Smarty_Template_Cached $cached cached object
|
|
*
|
|
* @return bool|void
|
|
*/
|
|
public function releaseLock(Smarty $smarty, Smarty_Template_Cached $cached)
|
|
{
|
|
$cached->is_locked = false;
|
|
@unlink($cached->lock_id);
|
|
}
|
|
}
|