<?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
|
*/
|
|
|
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
|
?>
|