tpl_cache.inc.php 5.36 KB
Newer Older
latham's avatar
latham committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
<?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.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 <kelvin@kelvinjones.co.uk>
 * @since 22/02/2002
 * @package vLIB
 * @access public
 */

23

latham's avatar
latham committed
24 25
class tplc extends tpl {

26
	/*-----------------------------------------------------------------------------\
latham's avatar
latham committed
27 28 29
|     DO NOT TOUCH ANYTHING IN THIS CLASS, IT MAY NOT WORK OTHERWISE           |
\-----------------------------------------------------------------------------*/

30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
	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;
	}


	/*----------------------------------------\
latham's avatar
latham committed
96 97 98
          Private Functions
-----------------------------------------*/

99 100 101 102 103

	/**
	 * FUNCTION: _checkCache
	 * checks if there's a cache, if there is then it will read the cache file as the template.
	 */
104 105
	function _checkCache ($tmplfile, $tmpl_from_string = false) {
		$this->_cachefile = $this->_getFilename($tmplfile, $tmpl_from_string);
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
		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
	 *
	 */
136 137 138
	function _getFilename($tmplfile, $tmpl_from_string = false) {
		if($tmpl_from_string == true) return $this->OPTIONS['CACHE_DIRECTORY'].'/'.md5('vlibCachestaRSTRING'.$tmplfile).'.'.$this->OPTIONS['CACHE_EXTENSION'];
		else return $this->OPTIONS['CACHE_DIRECTORY'].'/'.md5('vlibCachestaR'.realpath($tmplfile)).'.'.$this->OPTIONS['CACHE_EXTENSION'];
139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191
	}


	/**
	 * 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;
	}
latham's avatar
latham committed
192 193

} // -- end vlibTemplateCache class
194
?>