stripit/cache.class.php
2009-03-21 18:29:28 +00:00

318 lines
No EOL
6.2 KiB
PHP

<?php
/**
* Strip-It cache manager
*
* @author Leblanc Simon <contact@leblanc-simon.eu>
* @license http://www.gnu.org/licenses/gpl.html GPL
* @copyright 2008 Leblanc Simon
*
* @package stripit
*/
class STRIPIT_Cache
{
/**
* cache folder
* @var string
*/
var $cache_folder;
/**
* template filename
* @var string
*/
var $template;
/**
* template name
* @var string
*/
var $template_name;
/**
* name of strip
* @var string
*/
var $page;
/**
* name of the strip folder
* @var string
*/
var $strip_folder;
/**
* Stat about the strip file
* @var array
*/
var $stats;
/**
* cache data
* @var string
*/
var $cache_data;
/**
* Constructor
*
* Init the param of class
*
* @access public
*/
function STRIPIT_Cache()
{
$this->cache_folder = '';
$this->template = '';
$this->template_name = '';
$this->page = '';
$this->strip_folder = '';
$this->stats = array();
$this->cache_data = '';
}
/**
* Init the param of class and check the cache folder
*
* @param string $page Name of the strip for HTML or number of strip for RSS
* @param string $template Name of the template file
* @param string $template_name Name of the template
* @param string $strip_folder Name of the strip folder
* @param string $cache_folder Name of the folder where the cache file is save
* @param string $language The language to use
* @param bool $is_rss True if the page is for rss, False else
* @access public
* @return bool True if all is OK, false else
*/
function init($page, $template, $template_name, $strip_folder, $cache_folder, $language, $is_rss = false)
{
$this->template_name = $template_name;
$this->_getName($page, $language, $is_rss);
$this->template = $template;
$this->strip_folder = $strip_folder;
$this->cache_data = '';
if (!empty($cache_folder) && file_exists($cache_folder)) {
$this->cache_folder = $cache_folder;
} else {
$this->cache_folder = $this->template.'/cache';
}
return $this->_initFolder();
}
/**
* check if the page is in cache or if we must generate the page and the cache
*
* @access public
* @return bool True if the page is in cache, false else
*/
function isInCache()
{
if (!$this->_cacheExist()) {
return false;
} else {
include_once $this->cache_folder.'/'.$this->page;
$this->_getStats();
// a variable $stat_cache exist in the file cache
if (!is_array($stat_cache)) {
// the variable isn't good, generate cache
return false;
}
$count_cache = count($stat_cache);
$count_model = count($this->stats);
if ($count_cache != $count_model) {
// the number of file is different, generate cache
return false;
}
$compare = array_diff_assoc($stat_cache, $this->stats);
if (count($compare) == 0) {
// the variable $cache_data exist in the template file
$this->cache_data = $cache_data;
return true;
} else {
return false;
}
}
}
/**
* Init the folder name and create, if necessary, the folder for the cache
*
* @access private
* @return bool True if it's ok, false if error
*/
function _initFolder($cache_folder = '')
{
if (!is_dir($this->cache_folder)) {
// the directory doesn't exist, we create it!
if (!mkdir($this->cache_folder, 0777, true)) {
return false;
}
}
return true;
}
/**
* Generate the cache file
*
* @param string $data The contain HTML or RSS to put in cache
* @access private
* @return bool True if it's OK, false else
*/
function putInCache($data)
{
$cache = $this->_genCache($data);
// write in the cache, delete the contain of file, if it exists.
$handle = fopen($this->cache_folder.'/'.$this->page, 'w');
if (!$handle) {
return false;
}
if (fwrite($handle, $cache) === false) {
return false;
}
fclose($handle);
$this->cache_data = $data;
return true;
}
/**
* Generate the code to insert in the cache
*
* @param string $data The contain HTML or RSS to put in cache
* @access private
* @return string The code PHP + HTML or RSS to put in the cache file
*/
function _genCache($data)
{
$br = "\n";
$cache = '<?php'.$br;
$cache .= $this->_genStats();
$cache .= $br.$br;
$cache .= 'ob_start();'.$br;
$cache .= '?>'.$br;
$cache .= $data;
$cache .= $br.$br;
$cache .= '<?php'.$br;
$cache .= '$cache_data = ob_get_contents();'.$br;
$cache .= 'ob_end_clean();'.$br;
$cache .= '?>'.$br;
return $cache;
}
/**
* print cache
*
* @access public
*/
function getCache()
{
echo $this->cache_data;
//exit();
}
/**
* calculate the stats for the strips file
*
* @access private
*/
function _getStats()
{
// Open the given directory
$handle = opendir($this->strip_folder);
// Browse the directory
while($file = readdir($handle)) {
if($file != "." && $file != "..") {
// Get the extension of the file
$ext = pathinfo($file);
// If it is an SVG
if( $ext['extension'] == 'svg' ) {
// Add it to the list
clearstatcache();
$this->stats[$file] = filemtime($this->strip_folder.'/'.$file);
}
}
}
closedir($handle);
}
/**
* Generate the PHP variable $stat_cache
*
* @access private
* @return string The PHP code to insert in the cache file for have the stat at the generation time
*/
function _genStats()
{
$br = "\n";
$str = '';
$i = 0;
if (count($this->stats) == 0) {
$this->_getStats();
}
$str .= '$stat_cache = array(';
foreach($this->stats as $key => $value) {
if ($i != 0) {
$str .= ',';
}
$str .= '\''.$key.'\' => \''.$value.'\''.$br;
$i++;
}
$str .= ');'.$br;
return $str;
}
/**
* check if the cache file exist
*
* @access private
* @return bool True if the cache file exist, false else
*/
function _cacheExist()
{
if (file_exists($this->cache_folder.'/'.$this->page)) {
return true;
} else {
return false;
}
}
/**
* Generate the filename for cache
*
* @access private
*/
function _getName($page, $language, $is_rss)
{
if ($is_rss) {
$this->page = $page.'_'.$this->template_name.'_'.$language.'_cache_rss.php';
} else {
$this->page = $page.'_'.$this->template_name.'_'.$language.'_cache_html.php';
}
}
}
?>