📄 lite.php
字号:
<?php/*** \ingroup Cache** 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** Memory Caching is from an original idea of* Mike BENOIT <ipso@snappymail.ca>** Nota : A chinese documentation (thanks to RainX <china_1982@163.com>) is* available at :* http://rainx.phpmore.com/manual/cache_lite.html** @package Cache_Lite* @category Caching* @version $Id: Lite.php,v 1.45 2006/06/03 08:10:33 fab Exp $* @author Fabien MARTY <fab@php.net>*/define('CACHE_LITE_ERROR_RETURN', 1);define('CACHE_LITE_ERROR_DIE', 8);class Cache_Lite{ // --- Private properties --- /** * Directory where to put the cache files * (make sure to add a trailing slash) * * @var string $_cacheDir */ var $_cacheDir = '/tmp/'; /** * Enable / disable caching * * (can be very usefull for the debug of cached scripts) * * @var boolean $_caching */ var $_caching = true; /** * Cache lifetime (in seconds) * * If null, the cache is valid forever. * * @var int $_lifeTime */ var $_lifeTime = 3600; /** * Enable / disable fileLocking * * (can avoid cache corruption under bad circumstances) * * @var boolean $_fileLocking */ var $_fileLocking = true; /** * Timestamp of the last valid cache * * @var int $_refreshTime */ var $_refreshTime; /** * File name (with path) * * @var string $_file */ var $_file; /** * File name (without path) * * @var string $_fileName */ var $_fileName; /** * 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 */ var $_writeControl = true; /** * 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 */ var $_readControl = true; /** * Type of read control (only if read control is enabled) * * Available values are : * '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 */ var $_readControlType = 'crc32'; /** * Pear error mode (when raiseError is called) * * (see PEAR doc) * * @see setToDebug() * @var int $_pearErrorMode */ var $_pearErrorMode = CACHE_LITE_ERROR_RETURN; /** * Current cache id * * @var string $_id */ var $_id; /** * Current cache group * * @var string $_group */ var $_group; /** * Enable / Disable "Memory Caching" * * NB : There is no lifetime for memory caching ! * * @var boolean $_memoryCaching */ var $_memoryCaching = false; /** * Enable / Disable "Only Memory Caching" * (be carefull, memory caching is "beta quality") * * @var boolean $_onlyMemoryCaching */ var $_onlyMemoryCaching = false; /** * Memory caching array * * @var array $_memoryCachingArray */ var $_memoryCachingArray = array(); /** * Memory caching counter * * @var int $memoryCachingCounter */ var $_memoryCachingCounter = 0; /** * Memory caching limit * * @var int $memoryCachingLimit */ var $_memoryCachingLimit = 1000; /** * File Name protection * * 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 * special characters... * * @var boolean $fileNameProtection */ var $_fileNameProtection = true; /** * Enable / disable automatic serialization * * it can be used to save directly datas which aren't strings * (but it's slower) * * @var boolean $_serialize */ var $_automaticSerialization = false; /** * Disable / Tune the automatic cleaning process * * The automatic cleaning process destroy too old (for the given life time) * cache files when a new cache file is written. * 0 => no automatic cache cleaning * 1 => systematic cache cleaning * x (integer) > 1 => automatic cleaning randomly 1 times on x cache write * * @var int $_automaticCleaning */ var $_automaticCleaningFactor = 0; /** * Nested directory level * * Set the hashed directory structure level. 0 means "no hashed directory * structure", 1 means "one level of directory", 2 means "two levels"... * This option can speed up Cache_Lite only when you have many thousands of * cache file. Only specific benchs can help you to choose the perfect value * for you. Maybe, 1 or 2 is a good start. * * @var int $_hashedDirectoryLevel */ var $_hashedDirectoryLevel = 0; /** * Umask for hashed directory structure * * @var int $_hashedDirectoryUmask */ var $_hashedDirectoryUmask = 0700; /** * API break for error handling in CACHE_LITE_ERROR_RETURN mode * * In CACHE_LITE_ERROR_RETURN mode, error handling was not good because * for example save() method always returned a boolean (a PEAR_Error object * would be better in CACHE_LITE_ERROR_RETURN mode). To correct this without * breaking the API, this option (false by default) can change this handling. * * @var boolean */ var $_errorHandlingAPIBreak = false; // --- Public methods --- /** * Constructor * * $options is an assoc. Available options are : * $options = array( * '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), * 'automaticCleaningFactor' => distable / tune automatic cleaning process (int), * 'hashedDirectoryLevel' => level of the hashed directory system (int), * 'hashedDirectoryUmask' => umask for hashed directory structure (int), * 'errorHandlingAPIBreak' => API break for better error handling ? (boolean) * ); * * @param array $options options * @access public */ function Cache_Lite($options = array(NULL)) { foreach($options as $key => $value) { $this->setOption($key, $value); } } /** * Generic way to set a Cache_Lite option * * see Cache_Lite constructor for available options * * @var string $name name of the option * @var mixed $value value of the option * @access public */ function setOption($name, $value) { $availableOptions = array('errorHandlingAPIBreak', 'hashedDirectoryUmask', 'hashedDirectoryLevel', 'automaticCleaningFactor', 'automaticSerialization', 'fileNameProtection', 'memoryCaching', 'onlyMemoryCaching', 'memoryCachingLimit', 'cacheDir', 'caching', 'lifeTime', 'fileLocking', 'writeControl', 'readControl', 'readControlType', 'pearErrorMode'); if (in_array($name, $availableOptions)) { $property = '_'.$name; $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 (else : false) * @access public */ function get($id, $group = 'default', $doNotTestCacheValidity = false) { $this->_id = $id; $this->_group = $group; $data = false; if ($this->_caching) { $this->_setRefreshTime(); $this->_setFileName($id, $group); clearstatcache(); if ($this->_memoryCaching) { if (isset($this->_memoryCachingArray[$this->_file])) { if ($this->_automaticSerialization) { return unserialize($this->_memoryCachingArray[$this->_file]); } return $this->_memoryCachingArray[$this->_file]; } if ($this->_onlyMemoryCaching) { return false; } } if (($doNotTestCacheValidity) || (is_null($this->_refreshTime))) { if (file_exists($this->_file)) { $data = $this->_read(); } } else { if ((file_exists($this->_file)) && (@filemtime($this->_file) > $this->_refreshTime)) { $data = $this->_read(); } } if (($data) and ($this->_memoryCaching)) { $this->_memoryCacheAdd($data); } if (($this->_automaticSerialization) and (is_string($data))) { $data = unserialize($data); } return $data; } return false; } /** * 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 (else : false or a PEAR_Error object) * @access public */ function save($data, $id = NULL, $group = 'default') { if ($this->_caching) { if ($this->_automaticSerialization) { $data = serialize($data); } if (isset($id)) { $this->_setFileName($id, $group); } if ($this->_memoryCaching) { $this->_memoryCacheAdd($data); if ($this->_onlyMemoryCaching) { return true; } } if ($this->_automaticCleaningFactor>0) { $rand = rand(1, $this->_automaticCleaningFactor); if ($rand==1) { $this->clean(false, 'old'); } } if ($this->_writeControl) { $res = $this->_writeAndControl($data); if (is_bool($res)) { if ($res) { return true; } // if $res if false, we need to invalidate the cache @touch($this->_file, time() - 2*abs($this->_lifeTime)); return false; } } else { $res = $this->_write($data); } if (is_object($res)) { // $res is a PEAR_Error object if (!($this->_errorHandlingAPIBreak)) { return false; // we return false (old API) } } return $res; } return false; } /** * Remove a cache file * * @param string $id cache id * @param string $group name of the cache group
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -