| // +----------------------------------------------------------------------+ // // $Id: cache.php,v 1.1 2003/07/08 12:32:06 platinum Exp $ /** * Class uses all of vlibTemplate's functionality but caches the template files. * It creates an identical tree structure to your filesystem but with cached files. * * @author Kelvin Jones * @since 22/02/2002 * @package vLIB * @access public */ class tplc extends tpl { /*-----------------------------------------------------------------------------\ | DO NOT TOUCH ANYTHING IN THIS CLASS, IT MAY NOT WORK OTHERWISE | \-----------------------------------------------------------------------------*/ var $_cache = 1; // tells vlibTemplate that we're caching var $_cachefile; // full path to current cache file (even if it doesn't yet exist) var $_cacheexists; // has this file been cached before var $_cachefilelocked; // is this file currently locked whilst writing var $_cachefiledir; // dir of current cache file var $_clearcache = 0; /** * FUNCTION: clearCache * will unset a file, and set $this->_cacheexists to 0. * * @access public * @return boolean */ function clearCache() { $this->_clearcache = 1; return true; } /** * FUNCTION: recache * alias for clearCache(). * * @access public * @return boolean */ function recache() { return $this->clearCache(); } /** * FUNCTION: setCacheLifeTime * sets the lifetime of the cached file * * @param int $int number of seconds to set lifetime to * @access public * @return boolean */ function setCacheLifeTime($int = null) { if ($int == null || !is_int($int)) return false; if ($int == 0) $int = 60; if ($int == -1) $int = 157680000; // set to 5 yrs time $this->OPTIONS['CACHE_LIFETIME'] = $int; return true; } /** * FUNCTION: setCacheExtension * sets the extention of the cache file * * @param str $str name of new cache extention * @access public * @return boolean */ function setCacheExtension($str = null) { if ($str == null || !preg_match('/^[a-z0-9]+$/', strtolower($str))) return false; $this->OPTIONS['CACHE_EXTENSION'] = strtolower($str); return true; } /*----------------------------------------\ Private Functions -----------------------------------------*/ /** * FUNCTION: _checkCache * checks if there's a cache, if there is then it will read the cache file as the template. */ function _checkCache ($tmplfile) { $this->_cachefile = $this->_getFilename($tmplfile); if ($this->_clearcache) { if (file_exists($this->_cachefile)) unlink($this->_cachefile); return false; } if (file_exists($this->_cachefile)) { $this->_cacheexists = 1; // if it's expired if ((filemtime($this->_cachefile) + $this->OPTIONS['CACHE_LIFETIME']) < date('U') || filectime($this->_cachefile) < filemtime($tmplfile)) { $this->_cacheexists = 0; return false; // so that we know to recache } else { return true; } } else { $this->_cacheexists = 0; return false; } } /** * FUNCTION: _getFilename * gets the full pathname for the cached file * */ function _getFilename($tmplfile) { return $this->OPTIONS['CACHE_DIRECTORY'].'/'.md5('vlibCachestaR'.realpath($tmplfile)).'.'.$this->OPTIONS['CACHE_EXTENSION']; } /** * FUNCTION: _createCache * creates the cached file * */ function _createCache($data) { $cache_file = $this->_cachefile; if(!$this->_prepareDirs($cache_file)) return false; // prepare all of the directories $f = fopen($cache_file, "w"); flock($f, 2); // set an EXclusive lock if (!$f) vlibTemplateError::raiseError('VT_ERROR_NO_CACHE_WRITE', KILL, $cache_file); fputs($f, $data); // write the parsed string from vlibTemplate flock($f, 3); // UNlock file fclose($f); touch($cache_file); return true; } /** * FUNCTION: _prepareDirs * prepares the directory structure * */ function _prepareDirs($file) { if (empty($file)) die('no filename'); //do error in future $filepath = dirname($file); if (is_dir($filepath)) return true; $dirs = preg_split('/[\\/]/', $filepath); $currpath; foreach ($dirs as $dir) { $currpath .= $dir .'/'; $type = @filetype($currpath); ($type=='link') and $type = 'dir'; if ($type != 'dir' && $type != false && !empty($type)) { vlibTemplateError::raiseError('VT_ERROR_WRONG_CACHE_TYPE', KILL, 'directory: '.$currpath.', type: '.$type); } if ($type == 'dir') { continue; } else { $s = @mkdir($currpath, 0775); if (!$s) vlibTemplateError::raiseError('VT_ERROR_CACHE_MKDIR_FAILURE', KILL, 'directory: '.$currpath); } } return true; } } // -- end vlibTemplateCache class ?>