/html/inc/lib/vlib/vlibTemplate/cache.php
https://github.com/epsylon3/torrentflux · PHP · 202 lines · 102 code · 25 blank · 75 comment · 35 complexity · e07b21d26e86e9ae55429f3d338a3aba MD5 · raw file
- <?php
- /* vim: set expandtab tabstop=4 shiftwidth=4: */
- // +----------------------------------------------------------------------+
- // | PHP version 4.0 |
- // +----------------------------------------------------------------------+
- // | Copyright (c) 2002 Active Fish Group |
- // +----------------------------------------------------------------------+
- // | Authors: Kelvin Jones <kelvin@kelvinjones.co.uk> |
- // +----------------------------------------------------------------------+
- //
- // $Id: cache.php,v 1.4 2003/05/15 14:17:41 releasedj 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 <kelvin@kelvinjones.co.uk>
- * @since 22/02/2002
- * @package vLIB
- * @access public
- */
- class vlibTemplateCache extends vlibTemplate {
- /*-----------------------------------------------------------------------------\
- | 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')
- || filemtime($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 (empty($cache_file)) return false;
-
- if(!$this->_prepareDirs($cache_file)) return false; // prepare all of the directories
- $f = fopen($cache_file, "w");
- if (!$f) {
- if(!is_dir($this->OPTIONS['CACHE_DIRECTORY']) && !empty($this->OPTIONS['CACHE_DIRECTORY']) ) {
- @ system("mkdir -m 775 -p '".$this->OPTIONS['CACHE_DIRECTORY']."'");
- mkdir($this->OPTIONS['CACHE_DIRECTORY'], 0775);
- }
- $f = fopen($cache_file, "w");
- if (!$f) vlibTemplateError::raiseError('VT_ERROR_NO_CACHE_WRITE',KILL,$cache_file);
- }
- flock($f, 2); // set an EXclusive lock
- 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); // "/" ou "\"
- $currpath=$this->OPTIONS['CACHE_DIRECTORY'];
- foreach ($dirs as $dir) {
- if (empty($dir))
- continue;
-
- $currpath .= $dir .'/';
- $type = @filetype($currpath);
- ($type=='link') && $type = 'dir';
- if ($type != 'dir' and $type != false and !empty($type)) {
- vlibTemplateError::raiseError('VT_ERROR_WRONG_CACHE_TYPE',KILL,'directory: '.$currpath.', type: '.$type);
- }
- if ($type == 'dir') {
- continue;
- }
- else {
- $s = (@mkdir($currpath, 0775) || @mkdir($currpath) );
- if (!$s) {
- @ system("mkdir -m 0775 -p '".$this->OPTIONS['CACHE_DIRECTORY']."'");
- @ system("mkdir -m 0775 -p '$currpath'");
- vlibTemplateError::raiseError('VT_ERROR_CACHE_MKDIR_FAILURE',KILL,'directory: '.$currpath);
- }
- }
- }
- return true;
- }
- } // -- end vlibTemplateCache class
- ?>