Source for file Lite.php
Documentation is available at Lite.php
* Fast, light and safe Cache Class
* Cache_Lite is a fast, light and safe cache system. It's optimized
* for file containers. It is fast and safe (because it uses file
* locking and/or anti-corruption tests).
* There are some examples in the 'docs/examples' file
* Technical choices are described in the 'docs/technical' file
* A tutorial is available in english at this url :
* http://www.pearfr.org/index.php/en/article/cache_lite
* (big thanks to Pierre-Alain Joye for the translation)
* The same tutorial is also available in french at this url :
* http://www.pearfr.org/index.php/fr/article/cache_lite
* Memory Caching is from an original idea of
* Mike BENOIT <ipso@snappymail.ca>
* @version $Id: Lite.php,v 1.1 2005/07/22 01:57:12 eddieajau Exp $
* @author Fabien MARTY <fab@php.net>
define('CACHE_LITE_ERROR_RETURN', 1);
define('CACHE_LITE_ERROR_DIE', 8);
// --- Private properties ---
* Directory where to put the cache files
* (make sure to add a trailing slash)
* Enable / disable caching
* (can be very usefull for the debug of cached scripts)
* Cache lifetime (in seconds)
* Enable / disable fileLocking
* (can avoid cache corruption under bad circumstances)
* @var boolean $_fileLocking
* Timestamp of the last valid cache
* Enable / disable write control (the cache is read just after writing to detect corrupt entries)
* Enable write control will lightly slow the cache writing but not the cache reading
* Write control can detect some corrupt cache files but maybe it's not a perfect control
* @var boolean $_writeControl
* Enable / disable read control
* If enabled, a control key is embeded in cache file and this key is compared with the one
* calculated after the reading.
* @var boolean $_writeControl
* Type of read control (only if read control is enabled)
* 'md5' for a md5 hash control (best but slowest)
* 'crc32' for a crc32 hash control (lightly less safe but faster, better choice)
* 'strlen' for a length only test (fastest)
* @var boolean $_readControlType
* Pear error mode (when raiseError is called)
* @var int $_pearErrorMode
* Enable / Disable "Memory Caching"
* NB : There is no lifetime for memory caching !
* @var boolean $_memoryCaching
* Enable / Disable "Only Memory Caching"
* (be carefull, memory caching is "beta quality")
* @var boolean $_onlyMemoryCaching
* @var array $_memoryCachingArray
* @var int $memoryCachingCounter
* @var int $memoryCachingLimit
* if set to true, you can use any cache id or group name
* if set to false, it can be faster but cache ids and group names
* will be used directly in cache file names so be carefull with
* @var boolean $fileNameProtection
* Enable / disable automatic serialization
* it can be used to save directly datas which aren't strings
* @var boolean $_serialize
// --- Public methods ---
* $options is an assoc. Available options are :
* 'cacheDir' => directory where to put the cache files (string),
* 'caching' => enable / disable caching (boolean),
* 'lifeTime' => cache lifetime in seconds (int),
* 'fileLocking' => enable / disable fileLocking (boolean),
* 'writeControl' => enable / disable write control (boolean),
* 'readControl' => enable / disable read control (boolean),
* 'readControlType' => type of read control 'crc32', 'md5', 'strlen' (string),
* 'pearErrorMode' => pear error mode (when raiseError is called) (cf PEAR doc) (int),
* 'memoryCaching' => enable / disable memory caching (boolean),
* 'onlyMemoryCaching' => enable / disable only memory caching (boolean),
* 'memoryCachingLimit' => max nbr of records to store into memory caching (int),
* 'fileNameProtection' => enable / disable automatic file name protection (boolean),
* 'automaticSerialization' => enable / disable automatic serialization (boolean)
* @param array $options options
$availableOptions =
array('automaticSerialization', 'fileNameProtection', 'memoryCaching', 'onlyMemoryCaching', 'memoryCachingLimit', 'cacheDir', 'caching', 'lifeTime', 'fileLocking', 'writeControl', 'readControl', 'readControlType', 'pearErrorMode');
foreach($options as $key =>
$value) {
$this->$property =
$value;
* Test if a cache is available and (if yes) return it
* @param string $id cache id
* @param string $group name of the cache group
* @param boolean $doNotTestCacheValidity if set to true, the cache validity won't be tested
* @return string data of the cache (or false if no cache available)
function get($id, $group =
'default', $doNotTestCacheValidity =
false)
$this->_setFileName($id, $group);
if ($doNotTestCacheValidity) {
$this->_memoryCacheAdd($this->_file, $data);
* Save some data in a cache file
* @param string $data data to put in cache (can be another type than strings if automaticSerialization is on)
* @param string $id cache id
* @param string $group name of the cache group
* @return boolean true if no problem
function save($data, $id =
NULL, $group =
'default')
$this->_setFileName($id, $group);
$this->_memoryCacheAdd($this->_file, $data);
if (!$this->_writeAndControl($data)) {
return $this->_write($data);
* @param string $id cache id
* @param string $group name of the cache group
* @return boolean true if no problem
function remove($id, $group =
'default')
$this->_setFileName($id, $group);
$this->raiseError('Cache_Lite : Unable to remove cache !', -
3);
* if no group is specified all cache files will be destroyed
* else only cache files of the specified group will be destroyed
* @param string $group name of the cache group
* @return boolean true if no problem
function clean($group =
false)
$motif =
($group) ?
'cache_'.
md5($group).
'_' :
'cache_';
$motif =
($group) ?
'cache_'.
$group.
'_' :
'cache_';
if (strpos($key, $motif, 0)) {
$this->raiseError('Cache_Lite : Unable to open cache directory !', -
4);
if (($file !=
'.') &&
($file !=
'..')) {
if (strpos($file, $motif, 0)) {
$this->raiseError('Cache_Lite : Unable to remove cache !', -
3);
* When an error is found, the script will stop and the message will be displayed
* @param int $newLifeTime new life time (in seconds)
'array' =>
$this->_memoryCachingState
$this->save($data, $id, $group);
if ($data =
$this->get($id, $group, $doNotTestCacheValidity)) {
* Return the cache last modification time
* BE CAREFUL : THIS METHOD IS FOR HACKING ONLY !
* @return int last modification time
* To improve performances, the PEAR.php file is included dynamically.
* The file is so included only when an error is triggered. So, in most
* cases, the file isn't included and perfs are much better.
* @param string $msg error message
* @param int $code error code
include_once(mamboCore::get('mosConfig_absolute_path').
'/includes/PEAR/PEAR.php');
// --- Private methods ---
function _memoryCacheAdd($id, $data)
* Make a file name (with path)
* @param string $id cache id
* @param string $group name of the group
function _setFileName($id, $group)
* Read the cache file and return the content
* @return string content of the cache file
clearstatcache(); // because the filesize can be cached by PHP itself...
$hashControl =
@fread($fp, 32);
$data =
@fread($fp, $length);
if ($hashData !=
$hashControl) {
$this->raiseError('Cache_Lite : Unable to read cache !', -
2);
* Write the given data in the cache file
* @param string $data data to put in cache
* @return boolean true if ok
$this->raiseError('Cache_Lite : Unable to write cache !', -
1);
* Write the given data in the cache file and control it just after to avoir corrupted cache entries
* @param string $data data to put in cache
* @return boolean true if the test is ok
function _writeAndControl($data)
$dataRead =
$this->_read($data);
return ($dataRead==
$data);
* Make a control key with the string containing datas
* @param string $data data
* @param string $controlType type of control 'md5', 'crc32' or 'strlen'
* @return string control key
function _hash($data, $controlType)
$this->raiseError('Unknown controlType ! (available values are only \'md5\', \'crc32\', \'strlen\')', -
5);
Documentation generated on Mon, 05 May 2008 16:20:53 +0400 by phpDocumentor 1.4.0