📄 lite.php
字号:
* @return boolean true if no problem * @access public */ function remove($id, $group = 'default') { $this->_setFileName($id, $group); if ($this->_memoryCaching) { if (isset($this->_memoryCachingArray[$this->_file])) { unset($this->_memoryCachingArray[$this->_file]); $this->_memoryCachingCounter = $this->_memoryCachingCounter - 1; } if ($this->_onlyMemoryCaching) { return true; } } return $this->_unlink($this->_file); } /** * Clean the cache * * 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 * @param string $mode flush cache mode : 'old', 'ingroup', 'notingroup', * 'callback_myFunction' * @return boolean true if no problem * @access public */ function clean($group = false, $mode = 'ingroup') { return $this->_cleanDir($this->_cacheDir, $group, $mode); } /** * Set to debug mode * * When an error is found, the script will stop and the message will be displayed * (in debug mode only). * * @access public */ function setToDebug() { $this->setOption('pearErrorMode', CACHE_LITE_ERROR_DIE); } /** * Set a new life time * * @param int $newLifeTime new life time (in seconds) * @access public */ function setLifeTime($newLifeTime) { $this->_lifeTime = $newLifeTime; $this->_setRefreshTime(); } /** * Save the state of the caching memory array into a cache file cache * * @param string $id cache id * @param string $group name of the cache group * @access public */ function saveMemoryCachingState($id, $group = 'default') { if ($this->_caching) { $array = array( 'counter' => $this->_memoryCachingCounter, 'array' => $this->_memoryCachingState ); $data = serialize($array); $this->save($data, $id, $group); } } /** * Load the state of the caching memory array from a given cache file cache * * @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 * @access public */ function getMemoryCachingState($id, $group = 'default', $doNotTestCacheValidity = false) { if ($this->_caching) { if ($data = $this->get($id, $group, $doNotTestCacheValidity)) { $array = unserialize($data); $this->_memoryCachingCounter = $array['counter']; $this->_memoryCachingArray = $array['array']; } } } /** * Return the cache last modification time * * BE CAREFUL : THIS METHOD IS FOR HACKING ONLY ! * * @return int last modification time */ function lastModified() { return @filemtime($this->_file); } /** * Trigger a PEAR error * * 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 * @access public */ function raiseError($msg, $code) { lt_include( PLOG_CLASS_PATH."class/logger/loggermanager.class.php" ); $log =& LoggerManager::getLogger(); $log->error($msg, LOGGER_PRIO_ERROR); } /** * Extend the life of a valid cache file * * see http://pear.php.net/bugs/bug.php?id=6681 * * @access public */ function extendLife() { @touch($this->_file); } // --- Private methods --- /** * Compute & set the refresh time * * @access private */ function _setRefreshTime() { if (is_null($this->_lifeTime)) { $this->_refreshTime = null; } else { $this->_refreshTime = time() - $this->_lifeTime; } } /** * Remove a file * * @param string $file complete file path and name * @return boolean true if no problem * @access private */ function _unlink($file) { if (file_exists($file) && !@unlink($file)) { return $this->raiseError('Cache_Lite : Unable to remove cache !', -3); } return true; } /** * Recursive function for cleaning cache file in the given directory * * @param string $dir directory complete path (with a trailing slash) * @param string $group name of the cache group * @param string $mode flush cache mode : 'old', 'ingroup', 'notingroup', 'callback_myFunction' * @return boolean true if no problem * @access private */ function _cleanDir($dir, $group = false, $mode = 'ingroup') { if ($this->_fileNameProtection) { $motif = ($group) ? 'cache_'.md5($group).'_' : 'cache_'; } else { $motif = ($group) ? 'cache_'.$group.'_' : 'cache_'; } if ($this->_memoryCaching) { while (list($key, ) = each($this->_memoryCachingArray)) { if (strpos($key, $motif, 0)) { unset($this->_memoryCachingArray[$key]); $this->_memoryCachingCounter = $this->_memoryCachingCounter - 1; } } if ($this->_onlyMemoryCaching) { return true; } } if (!($dh = opendir($dir))) { return $this->raiseError('Cache_Lite : Unable to open cache directory !', -4); } $result = true; while ($file = readdir($dh)) { if (($file != '.') && ($file != '..')) { if (substr($file, 0, 6)=='cache_') { $file2 = $dir . $file; if (is_file($file2)) { switch (substr($mode, 0, 9)) { case 'old': // files older than lifeTime get deleted from cache if (!is_null($this->_lifeTime)) { if ((mktime() - @filemtime($file2)) > $this->_lifeTime) { $result = ($result and ($this->_unlink($file2))); } } break; case 'notingroup': if (!strpos($file2, $motif, 0)) { $result = ($result and ($this->_unlink($file2))); } break; case 'callback_': $func = substr($mode, 9, strlen($mode) - 9); if ($func($file2, $group)) { $result = ($result and ($this->_unlink($file2))); } break; case 'ingroup': default: if (strpos($file2, $motif, 0)) { $result = ($result and ($this->_unlink($file2))); } break; } } if ((is_dir($file2)) and ($this->_hashedDirectoryLevel>0)) { $result = ($result and ($this->_cleanDir($file2 . '/', $group, $mode))); } } } } return $result; } /** * Add some date in the memory caching array * * @param string $data data to cache * @access private */ function _memoryCacheAdd($data) { $this->_memoryCachingArray[$this->_file] = $data; if ($this->_memoryCachingCounter >= $this->_memoryCachingLimit) { list($key, ) = each($this->_memoryCachingArray); unset($this->_memoryCachingArray[$key]); } else { $this->_memoryCachingCounter = $this->_memoryCachingCounter + 1; } } /** * Make a file name (with path) * * @param string $id cache id * @param string $group name of the group * @access private */ function _setFileName($id, $group) { if ($this->_fileNameProtection) { $suffix = 'cache_'.md5($group).'_'.md5($id); } else { $suffix = 'cache_'.$group.'_'.$id; } $root = $this->_cacheDir; if ($this->_hashedDirectoryLevel>0) { $hash = md5($suffix); for ($i=0 ; $i<$this->_hashedDirectoryLevel ; $i++) { $root = $root . 'cache_' . substr($hash, 0, $i + 1) . '/'; } } $this->_fileName = $suffix; $this->_file = $root.$suffix; } /** * Read the cache file and return the content * * @return string content of the cache file (else : false or a PEAR_Error object) * @access private */ function _read() { $fp = @fopen($this->_file, "rb"); if ($this->_fileLocking) @flock($fp, LOCK_SH); if ($fp) { clearstatcache(); $length = @filesize($this->_file); $mqr = get_magic_quotes_runtime(); set_magic_quotes_runtime(0); if ($this->_readControl) { $hashControl = @fread($fp, 32); $length = $length - 32; } if ($length) { $data = @fread($fp, $length); } else { $data = ''; } set_magic_quotes_runtime($mqr); if ($this->_fileLocking) @flock($fp, LOCK_UN); @fclose($fp); if ($this->_readControl) { $hashData = $this->_hash($data, $this->_readControlType); if ($hashData != $hashControl) { if (!(is_null($this->_lifeTime))) { @touch($this->_file, time() - 2*abs($this->_lifeTime)); } else { @unlink($this->_file); } return false; } } return $data; } return $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 (a PEAR_Error object else) * @access private */ function _write($data) { if (!is_dir(dirname($this->_file)) && $this->_hashedDirectoryLevel > 0) { $hash = md5($this->_fileName); $root = $this->_cacheDir; for ($i=0 ; $i<$this->_hashedDirectoryLevel ; $i++) { $root = $root . 'cache_' . substr($hash, 0, $i + 1) . '/'; if (!(@is_dir($root))) { @mkdir($root, $this->_hashedDirectoryUmask); } } } $fp = @fopen($this->_file, "wb"); if ($fp) { if ($this->_fileLocking) @flock($fp, LOCK_EX); if ($this->_readControl) { @fwrite($fp, $this->_hash($data, $this->_readControlType), 32); } $len = strlen($data); @fwrite($fp, $data, $len); if ($this->_fileLocking) @flock($fp, LOCK_UN); @fclose($fp); return true; } return $this->raiseError('Cache_Lite : Unable to write cache file : '.$this->_file, -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 (else : false or a PEAR_Error object) * @access private */ function _writeAndControl($data) { $result = $this->_write($data); if (is_object($result)) { return $result; #聽We return the PEAR_Error object } $dataRead = $this->_read(); if (is_object($dataRead)) { return $result; #聽We return the PEAR_Error object } if ((is_bool($dataRead)) && (!$dataRead)) { return false; } 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 * @access private */ function _hash($data, $controlType) { switch ($controlType) { case 'md5': return md5($data); case 'crc32': return sprintf('% 32d', crc32($data)); case 'strlen': return sprintf('% 32d', strlen($data)); default: return $this->raiseError('Unknown controlType ! (available values are only \'md5\', \'crc32\', \'strlen\')', -5); } } } ?>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -