CodeIgniter(CI)缓存分析

来源:互联网 发布:淘宝卖nb正品 编辑:程序博客网 时间:2024/05/18 20:36
codeigniter 中的缓存系统分析ci中自带了一套自己的缓存系统这套缓存系统使用方法如下:只需要在controller或是model之中打开model中打开即可 $this->output->cache( 3 );//缓存时间为3分钟关于cache的配置项位于config/config.php文件中$config[ 'cache_path' ] = '';//设置文件路径从CodeIgniter.php文件里可以看出缓存的使用过程首先进入这里/*   文件:CodeIgniter.php * ------------------------------------------------------ *  Instantiate the output class * ------------------------------------------------------ */$OUT =& load_class('Output', 'core');/* * ------------------------------------------------------ *Is there a valid cache file?  If so, we're done... * ------------------------------------------------------ */if( $EXT->_call_hook( 'cache_override' ) === FALSE ){if ($OUT->_display_cache($CFG, $URI) == TRUE)//使用缓存文件或是删除过期文件{exit;}}/** * Output.php * Update/serve a cached file * 使用缓存文件 删除过期的文件 * @accesspublic * @param objectconfig class * @param objecturi class * @returnvoid */function _display_cache(&$CFG, &$URI){$cache_path = ($CFG->item('cache_path') == '') ? APPPATH.'cache/' : $CFG->item('cache_path');// Build the file path.  The file name is an MD5 hash of the full URI$uri =$CFG->item('base_url').$CFG->item('index_page').$URI->uri_string;$filepath = $cache_path.md5($uri);if ( ! @file_exists($filepath)){return FALSE;}if ( ! $fp = @fopen($filepath, FOPEN_READ)){return FALSE;}flock($fp, LOCK_SH);$cache = '';if(filesize($filepath) > 0){$cache = fread($fp, filesize($filepath));}flock($fp, LOCK_UN);fclose($fp);// Strip out the embedded timestampif ( ! preg_match("/(\d+TS--->)/", $cache, $match)){return FALSE;}// Has the file expired? If so we'll delete it.if(time() >= trim(str_replace('TS--->', '', $match['1']))){if (is_really_writable($cache_path)){@unlink($filepath);log_message('debug', "Cache file has expired. File deleted");return FALSE;}}// Display the cache$this->_display(str_replace($match['0'], '', $cache));log_message('debug', "Cache file is current. Sending it to browser.");return TRUE;//}以下代码显示输出(在未使用cache文件或cache文件过期情况下)/* CodeIgniter.php * ------------------------------------------------------ *  Send the final rendered output to the browser * ------------------------------------------------------ */if ($EXT->_call_hook('display_override') === FALSE){$OUT->_display();}若存在$this->output->cache( n ); //n > 0;/** *  Output.php * Set Cache * * @accesspublic * @paraminteger * @returnvoid */function cache($time){$this->cache_expiration = ( ! is_numeric($time)) ? 0 : $time;return $this;}  如果设置了缓存时间则需要写cache文件//Output.php// Do we need to write a cache file?  Only if the controller does not have its// own _output() method and we are not dealing with a cache file, which we// can determine by the existence of the $CI object aboveif ($this->cache_expiration > 0 && isset($CI) && ! method_exists($CI, '_output')){$this->_write_cache($output);}//Output.phpfunction _write_cache($output){//写缓存文件$CI =& get_instance();$path = $CI->config->item('cache_path');$cache_path = ($path == '') ? APPPATH.'cache/' : $path;if ( ! is_dir($cache_path) OR ! is_really_writable($cache_path)){log_message('error', "Unable to write cache file: ".$cache_path);return;}$uri =$CI->config->item('base_url').$CI->config->item('index_page').$CI->uri->uri_string();$cache_path .= md5($uri);if ( ! $fp = @fopen($cache_path, FOPEN_WRITE_CREATE_DESTRUCTIVE)){log_message('error', "Unable to write cache file: ".$cache_path);return;}$expire = time() + ($this->cache_expiration * 60);if (flock($fp, LOCK_EX)){fwrite($fp, $expire.'TS--->'.$output);//写缓存文件flock($fp, LOCK_UN);}else{log_message('error', "Unable to secure a file lock for file at: ".$cache_path);return;}fclose($fp);@chmod($cache_path, FILE_WRITE_MODE);log_message('debug', "Cache file written: ".$cache_path);}


原创粉丝点击