final_output; } // -------------------------------------------------------------------- /** * Set Output * * Sets the output string * * @access public * @param string * @return void */ function set_output($output) { $this->final_output = $output; } // -------------------------------------------------------------------- /** * Set Cache * * @access public * @param integer * @return void */ function cache($time) { $this->cache_expiration = ( ! is_numeric($time)) ? 0 : $time; } // -------------------------------------------------------------------- /** * Display Output * * All "view" data is automatically put into this variable * by the controller class: * * $this->final_output * * This function simply echos the variable out. It also does the following: * * Stops the benchmark timer so the page rendering speed can be shown. * * Determines if the "memory_get_usage' function is available so that * the memory usage can be shown. * * @access public * @return void */ function _display($output = '') { $BM =& _load_class('CI_Benchmark'); if ($output == '') { $output =& $this->final_output; } if ($this->cache_expiration > 0) { $this->_write_cache($output); } $elapsed = $BM->elapsed_time('code_igniter_start', 'code_igniter_end'); $memory = ( ! function_exists('memory_get_usage')) ? '0' : round(memory_get_usage()/1024/1024, 2).'MB'; $output = str_replace('{memory_usage}', $memory, $output); $output = str_replace('{elapsed_time}', $elapsed, $output); echo $output; log_message('debug', "Final output sent to browser"); log_message('debug', "Total execution time: ".$elapsed); } // -------------------------------------------------------------------- /** * Write a Cache File * * @access public * @return void */ function _write_cache($output) { $obj =& get_instance(); $path = $obj->config->item('cache_path'); $cache_path = ($path == '') ? BASEPATH.'cache/' : $path; if ( ! is_dir($cache_path) OR ! is_writable($cache_path)) { return; } $uri = $obj->config->item('base_url'). $obj->config->item('index_page'). $obj->uri->uri_string(); $cache_path .= md5($uri); if ( ! $fp = @fopen($cache_path, 'wb')) { log_message('error', "Unable to write ache file: ".$cache_path); return; } $expire = time() + ($this->cache_expiration * 60); flock($fp, LOCK_EX); fwrite($fp, $expire.'TS--->'.$output); flock($fp, LOCK_UN); fclose($fp); @chmod($cache_path, 0777); log_message('debug', "Cache file written: ".$cache_path); } // -------------------------------------------------------------------- /** * Update/serve a cached file * * @access public * @return void */ function _display_cache() { $CFG =& _load_class('CI_Config'); $RTR =& _load_class('CI_Router'); $cache_path = ($CFG->item('cache_path') == '') ? BASEPATH.'cache/' : $CFG->item('cache_path'); if ( ! is_dir($cache_path) OR ! is_writable($cache_path)) { return FALSE; } // Build the file path. The file name is an MD5 hash of the full URI $uri = $obj->config->item('base_url'). $obj->config->item('index_page'). $obj->uri->uri_string(); $filepath = $cache_path.md5($uri); if ( ! @file_exists($filepath)) { return FALSE; } if ( ! $fp = @fopen($filepath, 'rb')) { 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 timestamp if ( ! 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']))) { @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; } } // END Output Class ?>