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 + -
显示快捷键?