CI框架源码翻阅-Output.php
CI框架源码阅读---------Output.php
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');/** * CodeIgniter * * An open source application development framework for PHP 5.1.6 or newer * * @package CodeIgniter * @author ExpressionEngine Dev Team * @copyright Copyright (c) 2008 - 2011, EllisLab, Inc. * @license http://codeigniter.com/user_guide/license.html * @link http://codeigniter.com * @since Version 1.0 * @filesource */// ------------------------------------/** * Output Class * * Responsible 负责 for sending final output to browser * 负责把最终的输出发送到浏览器 * @package CodeIgniter * @subpackage Libraries * @category Output * @author ExpressionEngine Dev Team * @link http://codeigniter.com/user_guide/libraries/output.html */class CI_Output { /** * Current output string * 当前输出的字符串 * * @var string * @access protected */ protected $final_output; /** * Cache expiration time * 缓存终结的时间 * @var int * @access protected */ protected $cache_expiration = 0; /** * List of server headers * 服务器头列表 * @var array * @access protected */ protected $headers = array(); /** * List of mime types * * @var array * @access protected */ protected $mime_types = array(); /** * Determines wether profiler is enabled * 是否启用分析器 * @var book * @access protected */ protected $enable_profiler = FALSE; /** * Determines if output compression is enabled * 是否开启输出压缩 * @var bool * @access protected */ protected $_zlib_oc = FALSE; /** * List of profiler sections * 分析器列表 * * @var array * @access protected */ protected $_profiler_sections = array(); /** * Whether or not to parse variables like {elapsed_time} and {memory_usage} * 是否解析变量{elapsed_time} and {memory_usage} * 注意文档说这里有错误详见http://codeigniter.org.cn/user_guide/libraries/output.html * 最下方 * @var bool * @access protected */ protected $parse_exec_vars = TRUE; /** * Constructor * */ function __construct() { // 返回配置项zlib.output_compression的值并赋给$this->_zlib_oc // 如果配置项中开启了输出压缩功能则 $this->_zlib_oc 的值为on $this->_zlib_oc = @ini_get('zlib.output_compression'); // Get mime types for later // 获取mimetype if (defined('ENVIRONMENT') AND file_exists(APPPATH.'config/'.ENVIRONMENT.'/mimes.php')) { include APPPATH.'config/'.ENVIRONMENT.'/mimes.php'; } else { include APPPATH.'config/mimes.php'; } // $mimes 是mimes.php中定义的一个数组 $this->mime_types = $mimes; 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; return $this; } // -------------------------------- /** * Append Output * 在最终输出字符串后,追加数据 * Appends data onto the output string * * @access public * @param string * @return void */ function append_output($output) { if ($this->final_output == '') { $this->final_output = $output; } else { $this->final_output .= $output; } return $this; } // -------------------------------- /** * Set Header * 使用此方法,允许你设置将会被发送到浏览器的HTTP协议的标头,作用相当于php的标准函数: header()。 * Lets you set a server header which will be outputted with the final display. * 允许您设置一个服务器头用于最终的显示输出。 * Note: If a file is cached, headers will not be sent. We need to figure 计算 out * how to permit header data to be saved with the cache data... * * @access public * @param string * @param bool * @return void */ function set_header($header, $replace = TRUE) { // If zlib.output_compression is enabled it will compress the output, // but it will not modify the content-length header to compensate 补偿 for // the reduction减少 还原, causing 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 * 设置Content-Type * @access public * @param string extension of the file we're outputting * @return void */ 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 * 允许你手动设置服务器状态头(header) * @access public * @param int the status code * @param string * @return void */ function set_status_header($code = 200, $text = '') { set_status_header($code, $text); return $this; } // -------------------------------- /** * Enable/disable Profiler * 允许你开启或禁用分析器 * @access public * @param bool * @return void */ function enable_profiler($val = TRUE) { $this->enable_profiler = (is_bool($val)) ? $val : TRUE; return $this; } // -------------------------------- /** * Set Profiler Sections * 设置$this->_profiler_sections * Allows override of default / config settings for Profiler section display * 允许你在评测器启用时,控制(开/关)其特定部分 * * @access public * @param array * @return void */ function set_profiler_sections($sections) { foreach ($sections as $section => $enable) { $this->_profiler_sections[$section] = ($enable !== FALSE) ? TRUE : FALSE; } return $this; } // -------------------------------- /** * Set Cache * 设置缓存以及缓存时间 * @access public * @param integer 其中 $time 是你希望缓存更新的 分钟 数 * @return void */ function cache($time) { $this->cache_expiration = ( ! is_numeric($time)) ? 0 : $time; return $this; } // -------------------------------- /** * Display Output * 显示输出 * All "view" data is automatically put into this variable by the controller class: * * $this->final_output * * This function sends the finalized output data to the browser along * with any server headers and profile data. It also stops the * benchmark timer so the page rendering speed and memory usage can be shown. * * @access public * @param string * @return mixed */ function _display($output = '') { // Note: We use globals because we can't use $CI =& get_instance() // since this function is sometimes called by the caching mechanism, // which happens before the CI super object is available. // 注意:我们使用global 是因为我们不能使用$CI =& get_instance() global $BM, $CFG; // Grab the super object if we can. // //当然如果可以拿到超级控制器,我们先拿过来。 if (class_exists('CI_Controller')) { $CI =& get_instance(); } // -------------------------------- // Set the output data // 设置输出数据 if ($output == '') { $output =& $this->final_output; } // -------------------------------- // 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 above // 如果缓存时间>0 ,$CI 超级对象存在并且超级对象下面存在_output 方法 // 调用_write_cache 方法,写一个缓存文件 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 the data // 计算代码执行时间和内存使用时间 $elapsed = $BM->elapsed_time('total_execution_time_start', 'total_execution_time_end'); // 如果$this->parse_exec_vars为true,将输出中的{elapsed_time},{memory_usage} // 替换为计算出的时间。 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?压缩传输的处理。 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'); } } } // -------------------------------- // Are there any server headers to send? // 有没有服务器头发送? 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 are dealing with a cache file so we'll // simply echo out the data and exit. // 如果没有$CI就证明当前是一个缓存的输出,我们只简单的发送数据并退出 if ( ! isset($CI)) { echo $output; log_message('debug', "Final output sent to browser"); log_message('debug', "Total execution time: ".$elapsed); return TRUE; } // -------------------------------- // Do we need to generate profile data? // If so, load the Profile class and run it. // 如果开启了性能分析我们就调用, // 会生成一些报告到页面尾部用于辅助我们调试。 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 closing

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









多くのユーザーはスマートウォッチを選ぶときにファーウェイブランドを選択しますが、その中でもファーウェイ GT3pro と GT4 は非常に人気のある選択肢であり、多くのユーザーはファーウェイ GT3pro と GT4 の違いに興味を持っています。 Huawei GT3pro と GT4 の違いは何ですか? 1. 外観 GT4: 46mm と 41mm、材質はガラスミラー + ステンレススチールボディ + 高解像度ファイバーバックシェルです。 GT3pro: 46.6mm および 42.9mm、材質はサファイアガラス + チタンボディ/セラミックボディ + セラミックバックシェルです。 2. 健全な GT4: 最新の Huawei Truseen5.5+ アルゴリズムを使用すると、結果はより正確になります。 GT3pro: ECG 心電図と血管と安全性を追加

C 言語における return の使い方は、 1. 戻り値の型が void の関数については、return 文を使用して関数の実行を早期に終了することができます; 2. 戻り値の型が void ではない関数については、 return ステートメントは、関数の実行を終了するためのものです。結果は呼び出し元に返されます。 3. 関数の実行を早期に終了します。関数内で return ステートメントを使用して、関数の実行を早期に終了することもできます。関数が値を返さない場合。

実際は次のようなものです。当時、私のリーダーは私に perf ハードウェア パフォーマンス監視タスクを与えました。perf を使用するプロセス中に、コマンド perf list を入力すると、次の情報が表示されました。私のタスクは、これらのキャッシュ イベントを有効にすることです。しかし重要なのは、これらのミスやロードが何を意味するのか全く分からないということです。

ソースコード: publicclassReturnFinallyDemo{publicstaticvoidmain(String[]args){System.out.println(case1());}publicstaticintcase1(){intx;try{x=1;returnx;}finally{x=3;}}}#出力 上記のコードの出力は、単純に次のように結論付けることができます:finally の前に return が実行されます。バイトコード レベルで何が起こるかを見てみましょう。以下は、case1 メソッドのバイトコードの一部をインターセプトし、ソース コードを比較して、各命令の意味に注釈を付けます。

Windows 11 で Snipping Tool が機能しない理由 問題の根本原因を理解すると、適切な解決策を見つけるのに役立ちます。 Snipping Tool が正しく動作しない主な理由は次のとおりです。 フォーカス アシスタントがオンになっている: これにより、Snipping Tool が開かなくなります。破損したアプリケーション: 起動時にスニッピング ツールがクラッシュする場合は、破損している可能性があります。古いグラフィック ドライバー: 互換性のないドライバーは、スニッピング ツールに干渉する可能性があります。他のアプリケーションからの干渉: 実行中の他のアプリケーションが Snipping Tool と競合する可能性があります。証明書の有効期限が切れています: アップグレード プロセス中のエラーにより、この問題が発生する可能性があります。これらの簡単な解決策は、ほとんどのユーザーに適しており、特別な技術知識は必要ありません。 1. Windows および Microsoft Store アプリを更新する

キャッシュを使用すると、CPU の待ち時間が短縮されるため、コンピューターの速度が向上します。キャッシュは、CPU とメイン メモリ DRAM の間に位置する小さいながらも高速なメモリです。キャッシュの機能はCPUのデータ入出力速度を高めることであり、キャッシュは容量は小さいが速度が速く、メモリは速度は低いが容量が大きいため、スケジューリングアルゴリズムを最適化することでシステムのパフォーマンスを向上させることができます。大幅に改善されました。

キャッシュはキャッシュメモリと呼ばれ、中央処理装置とメインメモリの間にある高速かつ小容量のメモリで、通常は高速SRAMで構成され、CPU向けのこの種のローカルメモリが導入されています。 CPU とメモリ間の速度差がシステム パフォーマンスに及ぼす影響を軽減または排除します。キャッシュ容量は小さいですが高速、メモリ速度は遅いですが容量は大きく、スケジューリングアルゴリズムを最適化することでシステムのパフォーマンスが大幅に向上します。

キャッシュの特徴:CPUとメインメモリの間に設けられた1層または2層の高速かつ小容量のメモリで、コンピュータの電源を切ると情報は自然に失われます。 ROM の特性: メモリからデータを読み取ることのみが可能ですが、情報を書き込むことはできず、コンピュータの電源を切ってもデータは残ります。 ram の特性: メモリからデータを読み取り、メモリに情報を書き込むことができます。プログラムの実行に必要なコマンド、プログラム、およびデータを保存するために使用されます。コンピュータの電源がオフになると、情報は自然に失われます。
