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
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











많은 사용자들이 스마트 시계를 선택할 때 Huawei 브랜드를 선택하게 됩니다. 그 중 Huawei 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;}}}# 출력 위 코드의 출력은 간단히 결론을 내릴 수 있습니다. return은 finally 전에 실행됩니다. 바이트코드 수준에서 무슨 일이 일어나는지 살펴보겠습니다. 다음은 case1 메소드의 바이트코드 일부를 가로채서 소스 코드를 비교하여 각 명령어의 의미를 주석으로 표시합니다.

Windows 11에서 캡처 도구가 작동하지 않는 이유 문제의 근본 원인을 이해하면 올바른 솔루션을 찾는 데 도움이 될 수 있습니다. 캡처 도구가 제대로 작동하지 않는 주요 이유는 다음과 같습니다. 초점 도우미가 켜져 있습니다. 이렇게 하면 캡처 도구가 열리지 않습니다. 손상된 응용 프로그램: 캡처 도구가 실행 시 충돌하는 경우 응용 프로그램이 손상되었을 수 있습니다. 오래된 그래픽 드라이버: 호환되지 않는 드라이버가 캡처 도구를 방해할 수 있습니다. 다른 응용 프로그램의 간섭: 실행 중인 다른 응용 프로그램이 캡처 도구와 충돌할 수 있습니다. 인증서가 만료되었습니다. 업그레이드 프로세스 중 오류로 인해 이 문제가 발생할 수 있습니다. 이 문제는 대부분의 사용자에게 적합하며 특별한 기술 지식이 필요하지 않습니다. 1. Windows 및 Microsoft Store 앱 업데이트

캐시를 사용하면 CPU의 대기 시간이 단축되므로 컴퓨터 속도가 향상될 수 있습니다. 캐시는 CPU와 메인 메모리 DRAM 사이에 위치한 작지만 고속의 메모리입니다. 캐시의 기능은 CPU 데이터 입출력 속도를 높이는 것입니다. 캐시는 용량은 작지만 속도가 빠르며, 메모리 속도는 낮지만 용량이 큽니다. 시스템 성능은 향상됩니다. 크게 개선되었습니다.

캐시(Cache)는 캐시 메모리(Cache Memory)라고 하며 중앙처리장치와 메인 메모리 사이에 있는 고속 소용량 메모리로 일반적으로 고속 SRAM으로 구성된다. CPU와 메모리 사이의 속도 차이가 시스템 성능에 미치는 영향을 줄이거 나 제거합니다. 캐시 용량은 작지만 빠르며, 메모리 속도는 낮지만 용량이 큽니다. 스케줄링 알고리즘을 최적화하면 시스템 성능이 크게 향상됩니다.

캐시의 특징: CPU와 메인 메모리 사이에 설정되어 있는 1~2레벨의 고속, 소용량 메모리로, 컴퓨터의 전원이 꺼지면 정보가 자연스럽게 사라집니다. ROM의 특성: 메모리에서 데이터를 읽을 수만 있고 정보를 쓸 수는 없습니다. 컴퓨터 전원이 꺼진 후에도 데이터는 계속 존재합니다. 램의 특징: 메모리에서 데이터를 읽고 정보를 메모리에 쓸 수 있습니다. 프로그램을 실행하는 데 필요한 명령, 프로그램 및 데이터를 저장하는 데 사용됩니다. 컴퓨터 전원이 꺼지면 정보가 자연스럽게 손실됩니다.
