| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381 | <?php/*** Smarty Internal Plugin** @package Smarty* @subpackage Cacher*//*** Cache Handler API** @package Smarty* @subpackage Cacher* @author Rodney Rehm*/abstract class Smarty_CacheResource {    /**    * cache for Smarty_CacheResource instances    * @var array    */    public static $resources = array();    /**    * resource types provided by the core    * @var array    */    protected static $sysplugins = array(        'file' => true,    );    /**    * 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 abstract function populate(Smarty_Template_Cached $cached, Smarty_Internal_Template $_template);    /**    * populate Cached Object with timestamp and exists from Resource    *    * @param Smarty_Template_Cached $source cached object    * @return void    */    public abstract function populateTimestamp(Smarty_Template_Cached $cached);    /**    * Read the cached template and process header    *    * @param Smarty_Internal_Template $_template template object    * @param Smarty_Template_Cached $cached cached object    * @return booelan true or false if the cached content does not exist    */    public abstract function process(Smarty_Internal_Template $_template, Smarty_Template_Cached $cached=null);    /**    * Write the rendered template output to cache    *    * @param Smarty_Internal_Template $_template template object    * @param string $content content to cache    * @return boolean success    */    public abstract function writeCachedContent(Smarty_Internal_Template $_template, $content);    /**    * Return cached content    *    * @param Smarty_Internal_Template $_template template object    * @param string $content content of cache    */    public function getCachedContent(Smarty_Internal_Template $_template)    {        if ($_template->cached->handler->process($_template)) {            ob_start();            $_template->properties['unifunc']($_template);            return ob_get_clean();        }        return null;    }    /**    * Empty cache    *    * @param Smarty $smarty Smarty object    * @param integer $exp_time expiration time (number of seconds, not timestamp)    * @return integer number of cache files deleted    */    public abstract function clearAll(Smarty $smarty, $exp_time=null);    /**    * Empty cache for a specific template    *    * @param Smarty $smarty Smarty object    * @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 abstract function clear(Smarty $smarty, $resource_name, $cache_id, $compile_id, $exp_time);    public function locked(Smarty $smarty, Smarty_Template_Cached $cached)    {        // theoretically locking_timeout should be checked against time_limit (max_execution_time)        $start = microtime(true);        $hadLock = null;        while ($this->hasLock($smarty, $cached)) {            $hadLock = true;            if (microtime(true) - $start > $smarty->locking_timeout) {                // abort waiting for lock release                return false;            }            sleep(1);        }        return $hadLock;    }    public function hasLock(Smarty $smarty, Smarty_Template_Cached $cached)    {        // check if lock exists        return false;    }    public function acquireLock(Smarty $smarty, Smarty_Template_Cached $cached)    {        // create lock        return true;    }    public function releaseLock(Smarty $smarty, Smarty_Template_Cached $cached)    {        // release lock        return true;    }    /**    * Load Cache Resource Handler    *    * @param Smarty $smarty Smarty object    * @param string $type name of the cache resource    * @return Smarty_CacheResource Cache Resource Handler    */    public static function load(Smarty $smarty, $type = null)    {        if (!isset($type)) {            $type = $smarty->caching_type;        }        // try smarty's cache        if (isset($smarty->_cacheresource_handlers[$type])) {            return $smarty->_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];        }        // try sysplugins dir        if (isset(self::$sysplugins[$type])) {            if (!isset(self::$resources[$type])) {                $cache_resource_class = 'Smarty_Internal_CacheResource_' . ucfirst($type);                self::$resources[$type] = new $cache_resource_class();            }            return $smarty->_cacheresource_handlers[$type] = self::$resources[$type];        }        // try plugins dir        $cache_resource_class = 'Smarty_CacheResource_' . ucfirst($type);        if ($smarty->loadPlugin($cache_resource_class)) {            if (!isset(self::$resources[$type])) {                self::$resources[$type] = new $cache_resource_class();            }            return $smarty->_cacheresource_handlers[$type] = self::$resources[$type];        }        // give up        throw new SmartyException("Unable to load cache resource '{$type}'");    }    /**    * Invalid Loaded Cache Files    *    * @param Smarty $smarty Smarty object    */    public static function invalidLoadedCache(Smarty $smarty)    {        foreach ($smarty->template_objects as $tpl) {            if (isset($tpl->cached)) {                $tpl->cached->valid = false;                $tpl->cached->processed = false;            }        }    }}/*** Smarty Resource Data Object** Cache Data Container for Template Files** @package Smarty* @subpackage TemplateResources* @author Rodney Rehm*/class Smarty_Template_Cached {    /**    * Source Filepath    * @var string    */    public $filepath = false;    /**    * Source Content    * @var string    */    public $content = null;    /**    * Source Timestamp    * @var integer    */    public $timestamp = false;    /**    * Source Existance    * @var boolean    */    public $exists = false;    /**    * Cache Is Valid    * @var boolean    */    public $valid = false;    /**    * Cache was processed    * @var boolean    */    public $processed = false;    /**    * CacheResource Handler    * @var Smarty_CacheResource    */    public $handler = null;    /**    * Template Compile Id (Smarty_Internal_Template::$compile_id)    * @var string    */    public $compile_id = null;    /**    * Template Cache Id (Smarty_Internal_Template::$cache_id)    * @var string    */    public $cache_id = null;    /**    * Id for cache locking    * @var string    */    public $lock_id = null;    /**    * flag that cache is locked by this instance    * @var bool    */    public $is_locked = false;    /**    * Source Object    * @var Smarty_Template_Source    */    public $source = null;    /**    * create Cached Object container    *    * @param Smarty_Internal_Template $_template template object    */    public function __construct(Smarty_Internal_Template $_template)    {        $this->compile_id = $_template->compile_id;        $this->cache_id = $_template->cache_id;        $this->source = $_template->source;        $_template->cached = $this;        $smarty = $_template->smarty;        //        // load resource handler        //        $this->handler = $handler = Smarty_CacheResource::load($smarty); // Note: prone to circular references        //        //    check if cache is valid        //        if (!($_template->caching == Smarty::CACHING_LIFETIME_CURRENT || $_template->caching == Smarty::CACHING_LIFETIME_SAVED) || $_template->source->recompiled) {            $handler->populate($this, $_template);            return;        }        while (true) {            while (true) {                $handler->populate($this, $_template);                if ($this->timestamp === false || $smarty->force_compile || $smarty->force_cache) {                    $this->valid = false;                } else {                    $this->valid = true;                }                if ($this->valid && $_template->caching == Smarty::CACHING_LIFETIME_CURRENT && $_template->cache_lifetime >= 0 && time() > ($this->timestamp + $_template->cache_lifetime)) {                    // lifetime expired                    $this->valid = false;                }                if ($this->valid || !$_template->smarty->cache_locking) {                    break;                }                if (!$this->handler->locked($_template->smarty, $this)) {                    $this->handler->acquireLock($_template->smarty, $this);                    break 2;                }            }            if ($this->valid) {                if (!$_template->smarty->cache_locking || $this->handler->locked($_template->smarty, $this) === null) {                    // load cache file for the following checks                    if ($smarty->debugging) {                        Smarty_Internal_Debug::start_cache($_template);                    }                    if($handler->process($_template, $this) === false) {                        $this->valid = false;                    } else {                        $this->processed = true;                    }                    if ($smarty->debugging) {                        Smarty_Internal_Debug::end_cache($_template);                    }                } else {                    continue;                }            } else {                return;            }            if ($this->valid && $_template->caching === Smarty::CACHING_LIFETIME_SAVED && $_template->properties['cache_lifetime'] >= 0 && (time() > ($_template->cached->timestamp + $_template->properties['cache_lifetime']))) {                $this->valid = false;            }            if (!$this->valid && $_template->smarty->cache_locking) {                $this->handler->acquireLock($_template->smarty, $this);                return;            } else {                return;            }        }    }    /**    * Write this cache object to handler    *    * @param Smarty_Internal_Template $_template template object    * @param string $content content to cache    * @return boolean success    */    public function write(Smarty_Internal_Template $_template, $content)    {        if (!$_template->source->recompiled) {            if ($this->handler->writeCachedContent($_template, $content)) {                $this->timestamp = time();                $this->exists = true;                $this->valid = true;                if ($_template->smarty->cache_locking) {                    $this->handler->releaseLock($_template->smarty, $this);                }                return true;            }        }        return false;    }}?>
 |