CI Framework source Reading---------output.php
_ZLIB_OC//If output compression is turned on in the configuration item, the value of $this->_zlib_oc is On$this->_zlib_oc = @ini_get (' zlib.output_compression ');//Get MIME types for later//gets mimetypeif (defined (' Environment ') and file_exists (APPPATH. ' config/'). Environment. ' /mimes.php ') {include APPPATH. ' config/'. Environment. ' /mimes.php ';} Else{include APPPATH. ' config/mimes.php ';} $mimes is an array defined in mimes.php $this->mime_types = $mimes; Log_message (' Debug ', ' Output Class Initialized ');} --------------------------------/** * Get output * Using this method, you can get the data that will be output and save it * Returns the current output string * returns The current output String * @accesspublic * @returnstring */function get_output () {return $this->final_output;} --------------------------------/** * Set Outputs * * Sets the OUTPUT String * Sets the strings of the input * @accesspublic * @paramstring * @returnvoid */function Set_output ($output) {$this->final_output = $output; return $this;} --------------------------------/** * Append Output * Append the data after the final input string * Appends the onto the output string * * @access Public * @paramstring * @returnvoid */function append_output ($output) {if ($this->final_output = = ") {$this->final_ output = $output;} else{$this->final_output. = $output;} return $this;} --------------------------------/** * Set Header * Use this method to allow you to set the header of the HTTP protocol that will be sent to the browser, acting as a standard function of PHP: Header (). * Lets You set a server header which is outputted with the final display. * Allows you to set a server header for the final display output. * Note:if A file is cached, headers won't is sent. We need to figure calculation out * How to permit header data to being saved with the cache data ... * * @accesspublic * @paramstring * @param bool * @returnvoid */function Set_header ($header, $replace = TRUE) {//If zlib.output_compression is enabled it wil L COMPRESS the output,//but it won't modify the Content-length header to compensate compensate for//the reduction reduce restore, Causi Ng the browser to hang waiting for more data.//We'll just skip content-length in those cases.if ($this->_zlib_oc & & strncasecmp ($header, ' content-length ', 14) = = 0) {return;} $this->headers[] = Array ($header, $replace); return $this;} --------------------------------/** * Set Content Type Header * Settings Content-type * @accesspublic * @paramstringextension The of the file we ' re outputting * @returnvoid */function set_content_type ($mime _type) {if (Strpos ($mime _type, '/') = = = = FALSE) { $extension = LTrim ($mime _type, '. '); /Is this extension supported?if (isset ($this->mime_types[$extension]) {$mime _type =& $this->mime_types[$ Extension];if (Is_array ($mime _type)) {$mime _type = current ($mime _type);}}} $header = ' Content-type: '. $mime _type; $this->headers[] = Array ($header, TRUE); return $this;} --------------------------------/** * Set HTTP Status Header * moved to Common procedural functions in 1.7.2 * allows you to set the service manually Service Status Header (header) * @accesspublic * @paramintthe Status code * @paramstring * @returnvoid */function set_status_header ($code = $text = ") {Set_status_header ($code, $text); return $this;} --------------------------------/** * enable/disable ProFiler * allows you to turn on or disable the parser * @accesspublic * @parambool * @returnvoid */function enable_profiler ($val = TRUE) {$this->ENABLE_PR Ofiler = (Is_bool ($val))? $val: True;return $this;} --------------------------------/** * Set Profiler Sections * Set $this->_profiler_sections * allows override of Defau Lt/config Settings for Profiler section display * allows you to control (on/off) its specific part when the profiler is enabled * * @accesspublic * @paramarray * @returnvoid */function set_profiler_sections ($sections) {foreach ($sections as $section = = $enable) {$this->_profiler_ sections[$section] = ($enable!== FALSE)? True:false;} return $this;} --------------------------------/** * Set Cache * Sets Caching and cache time * @accesspublic * @paraminteger where $time is the number of minutes you wish to cache updates * @returnvoid */function Cache ($time) {$this->cache_expiration = (! Is_numeric ($time))? 0: $time; return $this;} --------------------------------/** * Display OUTPUT * Show outputs * All "view" data are automatically put into this variable b Y the Controller class: * * $this->fiNal_output * * This function sends the finalized output data to the browser along * with any server headers and profile da Ta. It also stops the * benchmark timer so the page rendering speed and memory usage can be shown. * * @accesspublic * @param string * @returnmixed */function _display ($output = ") {//Note:we use globals because We can ' t use $CI =& get_instance ()//Since this function was sometimes called by the caching mechanism,//which happens befor E The CI Super object is available.//Note: We use global because we cannot use $ci =& get_instance () global $BM, $CFG;//Grab The Super Object if we can.////Of course if we can get the super controller, we'll get it first. if (class_exists (' Ci_controller ')) {$CI =& get_instance ();} --------------------------------//Set the output data//set the export data if ($output = = ") {$output =& $this->FINAL_OUTPU t;} --------------------------------//Do we need to write a cache file? Only if the controller does not has its//own _output () method and we is not dealing with a cache file, whicH we//can determine by the existence of the $CI object above//if the cache time >0, $CI the Super object exists and the Super object exists _output method//Call _WRITE_CAC The He method, write a cache file if ($this->cache_expiration > 0 && isset ($CI) &&! method_exists ($CI, ' _output ')) {$ This->_write_cache ($output);} --------------------------------//Parse out the elapsed time and memory usage,//then swap the pseudo-variables with T He data//calculate code execution time and memory usage time $elapsed = $BM->elapsed_time (' Total_execution_time_start ', ' total_execution_time_end ') ;//If $this->parse_exec_vars is true, replace {elapsed_time},{memory_usage}//in the output with the calculated time. if ($this->parse_exec_vars = = = TRUE) {$memory = (! function_exists (' memory_get_usage '))? ' 0 ': Round (Memory_get_usage ()/1024/1024, 2). ' MB '; $output = Str_replace (' {elapsed_time} ', $elapsed, $output); $output = Str_replace (' {memory_usage} ', $memory, $ Output);} --------------------------------//Is compression requested? processing of compressed transmissions. if ($CFG->item (' compress_output ') = = = TRUE && $this->_zlib_oc= = FALSE) {if (extension_loaded (' zlib ')) {if (Isset ($_server[' http_accept_encoding ')) and Strpos ($_server[' http_ Accept_encoding '], ' gzip ')!== (FALSE) {ob_start (' Ob_gzhandler ');}}} --------------------------------//Is there any servers headers to send?//have server hair sent? if (count ($this->headers) > 0) {foreach ($this->headers as $header) {@header ($header [0], $header [1]);}} --------------------------------//Does The $CI object exist?//If Not we know we is dealing with a cache file so we ' L l//simply echo out the data and exit.//if there is no $ci to prove that the current is a cached output, we simply send the data and exit if (! Isset ($CI)) {echo $output; Log_message (' De Bug ', "Final output sent to browser"), Log_message (' Debug ', "Total execution Time:". $elapsed); return TRUE;} --------------------------------//Do we need to generate profiles data?//if so, load the profile class and run it.//as When the performance analysis is turned on we call,//will generate some reports to the end of the page to assist us in debugging. if ($this->enable_profiler = = TRUE) {$CI->load->library (' Profiler '); if (! empty ($this->_profiler_sectioNS) {$CI->profiler->set_sections ($this->_profiler_sections);} If The output data contains closingandtags//we'll remove them and add them back after we insert the profile data//if presentTag, we will delete, insert our profiling code and then add back if (Preg_match ("|.*?|is ", $output)) {$output = Preg_replace (" |.*?|is ",", $output); $output. = $CI->profiler->run (); $output. = '';} else{$output. = $CI->profiler->run ();}} --------------------------------//Does the controller contain a function named _output ()//If so send the output ther E. Otherwise, Echo it.//if the controller has _output this method we call directly//If no data is sent directly to the browser if (method_exists ($CI, ' _output ')) {$CI->_output ( $output);} Else{echo $output; Send it to the browser!} Log_message (' Debug ', "Final output sent to browser"), Log_message (' Debug ', "Total execution Time:". $elapsed);} --------------------------------/** * Write A cache file * Generates a cached files * @accesspublic * @param string * @returnvoid */fun Ction _write_cache ($output) {//Call Super Object $ci =& get_instance ();//Find cache path $path = $CI->config->item (' Cache_path ') ; $cache _path = ($path = = ")? APPPATH. ' cache/': $path;//If the cache path is not a folder or is not writable, an error is returned. if (! Is_dir ($cache _path) OR! is_really_writable ($cache _path)) {log_message (' error ', "Unable to write cache file:" $cach E_path); return;} Get $uri$uri = $CI->config->item (' Base_url '). $CI->config->item (' index_pAge '). $CI->uri->uri_string ();//Generate Cache file. $cache _path. = MD5 ($uri), if (! $fp = @fopen ($cache _path, fopen_write_create_destructive)) {log_message (' error ', "unable To write Cache file: ". $cache _path); return;} Calculates the cache file expiration time. $expire = time () + ($this->cache_expiration *), 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);} --------------------------------/** * Update/serve A cached file * There is a call to this method in codeigniter.php, this method is responsible for the output of the cache, * If this method is called with output in codeigniter.php, the run of this request will end directly with the cached output as the response. * * @accesspublic * @param objectconfig class * @param objecturi class * @returnvoid */function _display_cache (& $CFG, & $URI) {//Get the path to save cache $cache_path = ($CFG->item (' cache_path ') = = ")? APPPATH. ' cache/': $CFG->item (' Cache_path ');//Build the file path.The file name is a MD5 hash of the full uri//one exact route will correspond to a cache file, and the cache file is the MD5 cipher for the corresponding routing string. $uri = $CFG->item (' Base_url '). $CFG->item (' Index_page '). $URI->uri_string; $filepath = $cache _path.md5 ($uri) If you do not have this cache file, you can return FALSE if you fail to get cached content. if (! @file_exists ($filepath)) {return FALSE;} If there is this cache file, but cannot read, the cache content fails and the same returns false. if (! $fp = @fopen ($filepath, Fopen_read)) {return FALSE;} Open to the cache file and use $FP as the handle. The next step is to obtain a shared lock (read). Flock ($FP, lock_sh); $cache = "; if (FileSize ($filepath) > 0) {$cache = Fread ($fp, FileSize ($filepath));} Unlock flock ($fp, lock_un);//close File connection. Fclose ($FP);//The following TS--->, just because the content of the CI cache file//is stipulated in the digital +ts---> start. This number represents the creation time. If it does not conform to this structure, it can be considered a non-CI cache file, or the file is corrupted,//Get cache content failed, return false. Strip out the embedded timestampif (! Preg_match ("/(\d+ts--->)/", $cache, $match)) {return FALSE;} Has the file expired? If so we'll delete it.//to determine if the cache expires, if it expires we will remove it if (time () >= trim (str_replace (' TS---> ', ', $match [' 1 ']))) {if (is_real Ly_writable ($cache _path)) {@unlink ($filepath); Log_message (' Debug ', "The 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/* end of file output.php *//* location:./system/core/output.php */