#native_company# #native_desc#
#native_cta#

M4Cache

By Fredrik Larsson
on March 27, 2001

Version: 1.0

Type: Class

Category: Databases

License: GNU General Public License

Description: Caching system, fast and flexible

<?
/*

2001-03-01 - Fredrik ([email protected])
		 Cachinging....
		 M4Cache version 1.0

Usage:

include "class.M4Cache.php";
$cache = new M4Cache(true, true);


$page = "<html>....</html>";

$cache->process($page);	
exit;




*/

class M4Cache
{

	var $cacheDir  = "/home/foo/cache";	//no trailing slash(/)
	var $filename  = "";
	var $pid       = 0;
	var $compress  = false;
	var $cache;
	
	/*
	Paremeters
	1st = compress the cache file
	2nd = cache on/off
	3rs = manualy fake the filename (ie: backstage pass)
	
	*/
	
	function M4Cache($compress_ = false, $cache_ = true, $fakenr = false)
	{
		$this->cache = $cache_;
		
		if ($this->cache == false)		//no caching
		{
			return false;
		}
		
		$start = $this->utime();
		$this->compress = $compress_;
		$this->pid = "." . getmypid();
		$ptr =  getenv ("QUERY_STRING");
		
		$ptr = strtr($ptr, "/", "_");
		$this->filename = $this->cacheDir . getenv("SCRIPT_NAME") . "?" . $ptr;
		
		if ($fakenr != false)
		{
			$this->filename .= "&fakeNR=$fakenr";
		}
		
		if (file_exists($this->filename) == true)
		{
			$fp = fopen($this->filename, "r");
			$size = filesize($this->filename);
			
			$ptr = fread($fp, $size);
			fclose($fp);
			
			$end = $this->utime();
			$runtime = $end - $start;
			
			echo $ptr . "n<!-- CACHE Completed in $runtime seconds -->";
			exit;
		}
		return false;
		
	}
	
	function process($ptr, $start = null)
	{
		
		if ($this->cache == false)		//no caching
		{
			echo $ptr;
			return false;
		}
	
				if ($start == null)
				{
					$start = $this->utime();
				}	
				$fp = @fopen($this->filename . $this->pid, "w");
				if ($fp == false)
				{
					echo "<pre>Error[M4.Cache]: unable to open cache</pre>";
					exit;
				}
				if ($this->compress == true)
				{
			      $ptr = @eregi_replace("[[:space:]]+", " ", $ptr); 
				  
				  if ($ptr == "")
				  {
					echo "<pre>Error[M4.Cache]: timeout</pre>";
					exit;
				  }
				  
                  $ptr = ereg_replace("[nt]", "", $ptr );
              //    $ptr = ereg_replace("[  ]*", " ", $ptr );
				}
				
				fwrite($fp, $ptr);
				fclose($fp);
				@unlink($this->filename);
				rename($this->filename . $this->pid, $this->filename);
			
				$end = $this->utime();
				$runtime = $end - $start;
			
				echo $ptr . "n<!-- DB Completed in $runtime seconds -->";
				return true;
	
	}
	function getFilename()
	{
		echo $this->filename;
	}
	function utime ()
	{
		$time = explode( " ", microtime());
		$usec = (double)$time[0];
		$sec = (double)$time[1];
		return $sec + $usec;
    }

}?>