lite.php
来自「视频监控网络部分的协议ddns,的模块的实现代码,请大家大胆指正.」· PHP 代码 · 共 756 行 · 第 1/2 页
PHP
756 行
{ $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->_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->_refreshTime = time() - $newLifeTime; } /** * 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) { include_once('PEAR.php'); PEAR::raiseError($msg, $code, $this->_pearErrorMode); } // --- Private methods --- /** * Remove a file * * @param string $file complete file path and name * @return boolean true if no problem * @access private */ function _unlink($file) { if (!@unlink($file)) { $this->raiseError('Cache_Lite : Unable to remove cache !', -3); return false; } else { 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, $value) = 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))) { $this->raiseError('Cache_Lite : Unable to open cache directory !', -4); return false; } $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 ((mktime() - filemtime($file2)) > $this->_lifeTime) { $result = ($result and ($this->_unlink($file2))); } break; case 'notingrou': 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 $id cache id * @param string $data data to cache * @access private */ function _memoryCacheAdd($id, $data) { $this->_memoryCachingArray[$this->_file] = $data; if ($this->_memoryCachingCounter >= $this->_memoryCachingLimit) { list($key, $value) = 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 * @access private */ function _read() { $fp = @fopen($this->_file, "rb"); if ($this->_fileLocking) @flock($fp, LOCK_SH); if ($fp) { clearstatcache(); // because the filesize can be cached by PHP itself... $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) { @touch($this->_file, time() - 2*abs($this->_lifeTime)); return false; } } return $data; } $this->raiseError('Cache_Lite : Unable to read cache !', -2); return false; } /** * Write the given data in the cache file * * @param string $data data to put in cache * @return boolean true if ok * @access private */ function _write($data) { $try = 1; while ($try<=2) { $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; } else { if (($try==1) and ($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) . '/'; @mkdir($root, $this->_hashedDirectoryUmask); } $try = 2; } else { $try = 999; } } } $this->raiseError('Cache_Lite : Unable to write cache file : '.$this->_file, -1); return false; } /** * 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 * @access private */ function _writeAndControl($data) { $this->_write($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 * @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: $this->raiseError('Unknown controlType ! (available values are only \'md5\', \'crc32\', \'strlen\')', -5); } } } ?>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?