diff options
Diffstat (limited to 'system/libraries/Output.php')
-rw-r--r-- | system/libraries/Output.php | 241 |
1 files changed, 241 insertions, 0 deletions
diff --git a/system/libraries/Output.php b/system/libraries/Output.php new file mode 100644 index 000000000..f5db3e0d0 --- /dev/null +++ b/system/libraries/Output.php @@ -0,0 +1,241 @@ +<?php if (!defined('BASEPATH')) exit('No direct script access allowed'); +/** + * Code Igniter + * + * An open source application development framework for PHP 4.3.2 or newer + * + * @package CodeIgniter + * @author Rick Ellis + * @copyright Copyright (c) 2006, pMachine, Inc. + * @license http://www.codeignitor.com/user_guide/license.html + * @link http://www.codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * Output Class + * + * Responsible for sending final output to browser + * + * @package CodeIgniter + * @subpackage Libraries + * @category Output + * @author Rick Ellis + * @link http://www.codeigniter.com/user_guide/libraries/output.html + */ +class CI_Output { + + var $final_output; + var $cache_expiration = 0; + + function CI_Output() + { + log_message('debug', "Output Class Initialized"); + } + + // -------------------------------------------------------------------- + + /** + * Get Output + * + * Returns the current output string + * + * @access public + * @return string + */ + function get_output() + { + return $this->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 = ( ! ctype_digit($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', 1). + $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 = $CFG->item('base_url', 1).$CFG->item('index_page').$RTR->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 +?>
\ No newline at end of file |