Maison développement back-end tutoriel php CI框架源码翻阅-Output.php

CI框架源码翻阅-Output.php

Jun 13, 2016 pm 12:52 PM
cache gt output return this

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 
Copier après la connexion
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Quelles sont les différences entre Huawei GT3 Pro et GT4 ? Quelles sont les différences entre Huawei GT3 Pro et GT4 ? Dec 29, 2023 pm 02:27 PM

De nombreux utilisateurs choisiront la marque Huawei lors du choix des montres intelligentes. Parmi eux, les Huawei GT3pro et GT4 sont des choix très populaires. De nombreux utilisateurs sont curieux de connaître la différence entre Huawei GT3pro et GT4. Quelles sont les différences entre Huawei GT3pro et GT4 ? 1. Apparence GT4 : 46 mm et 41 mm, le matériau est un miroir en verre + un corps en acier inoxydable + une coque arrière en fibre haute résolution. GT3pro : 46,6 mm et 42,9 mm, le matériau est du verre saphir + corps en titane/corps en céramique + coque arrière en céramique 2. GT4 sain : en utilisant le dernier algorithme Huawei Truseen5.5+, les résultats seront plus précis. GT3pro : ajout d'un électrocardiogramme ECG, d'un vaisseau sanguin et de la sécurité

Explication détaillée de l'utilisation de return en langage C Explication détaillée de l'utilisation de return en langage C Oct 07, 2023 am 10:58 AM

L'utilisation de return en langage C est la suivante : 1. Pour les fonctions dont le type de valeur de retour est void, vous pouvez utiliser l'instruction return pour terminer l'exécution de la fonction plus tôt. 2. Pour les fonctions dont le type de valeur de retour n'est pas void, la fonction de ; l'instruction return sert à terminer l'exécution de la fonction.Le résultat est renvoyé à l'appelant ;3. Terminer l'exécution de la fonction plus tôt que prévu.À l'intérieur de la fonction, nous pouvons utiliser l'instruction return pour terminer l'exécution de la fonction plus tôt. si la fonction ne renvoie pas de valeur.

Après avoir rejoint l'entreprise, j'ai compris ce qu'est Cache Après avoir rejoint l'entreprise, j'ai compris ce qu'est Cache Jul 31, 2023 pm 04:03 PM

La chose est en fait comme ça. À ce moment-là, mon chef m'a confié une tâche de surveillance des performances du matériel. Pendant le processus d'utilisation de perf, j'ai entré la liste des commandes perf et j'ai vu les informations suivantes : Ma tâche est d'activer ces événements de cache. être compté normalement. Mais le fait est que je n'ai aucune idée de ce que signifient ces ratés et ces charges.

Quel est l'ordre d'exécution des instructions return et enfin en Java ? Quel est l'ordre d'exécution des instructions return et enfin en Java ? Apr 25, 2023 pm 07:55 PM

Code source : publicclassReturnFinallyDemo{publicstaticvoidmain(String[]args){System.out.println(case1());}publicstaticintcase1(){intx;try{x=1;returnx;}finally{x=3;}}}# Sortie La sortie du code ci-dessus peut simplement conclure : return est exécuté avant finalement. Jetons un coup d'œil à ce qui se passe au niveau du bytecode. Ce qui suit intercepte une partie du bytecode de la méthode case1 et compare le code source pour annoter la signification de chaque instruction dans

Correctif : l'outil de capture ne fonctionne pas sous Windows 11 Correctif : l'outil de capture ne fonctionne pas sous Windows 11 Aug 24, 2023 am 09:48 AM

Pourquoi l'outil Snipping ne fonctionne pas sous Windows 11 Comprendre la cause première du problème peut aider à trouver la bonne solution. Voici les principales raisons pour lesquelles l'outil de capture peut ne pas fonctionner correctement : L'assistant de mise au point est activé : cela empêche l'ouverture de l'outil de capture. Application corrompue : si l'outil de capture plante au lancement, il est peut-être corrompu. Pilotes graphiques obsolètes : des pilotes incompatibles peuvent interférer avec l'outil de capture. Interférence provenant d'autres applications : d'autres applications en cours d'exécution peuvent entrer en conflit avec l'outil de capture. Le certificat a expiré : une erreur lors du processus de mise à niveau peut provoquer ce problème. Solution simple. Celles-ci conviennent à la plupart des utilisateurs et ne nécessitent aucune connaissance technique particulière. 1. Mettez à jour les applications Windows et Microsoft Store

Pourquoi l'utilisation du cache augmente-t-elle la vitesse de l'ordinateur ? Pourquoi l'utilisation du cache augmente-t-elle la vitesse de l'ordinateur ? Dec 09, 2020 am 11:28 AM

L'utilisation du cache peut augmenter la vitesse de l'ordinateur car le cache réduit le temps d'attente du processeur. Le cache est une mémoire petite mais rapide située entre le processeur et la mémoire principale DRAM. La fonction du cache est d'augmenter le taux d'entrée et de sortie des données du processeur ; le cache a une petite capacité mais une vitesse rapide, tandis que la vitesse de la mémoire est faible mais a une grande capacité. En optimisant l'algorithme de planification, les performances du système seront améliorées. grandement amélioré.

Qu'est-ce que le cache ? Qu'est-ce que le cache ? Nov 25, 2022 am 11:48 AM

Le cache est appelé mémoire cache. Il s'agit d'une mémoire haute vitesse de petite capacité entre l'unité centrale et la mémoire principale. Elle est généralement composée de SRAM haute vitesse. Ce type de mémoire locale est orienté vers le CPU. pour réduire ou éliminer l'écart entre le processeur et la mémoire. L'impact de la différence de vitesse entre eux sur les performances du système. La capacité du cache est petite mais rapide, la vitesse de la mémoire est faible mais la capacité est grande. En optimisant l'algorithme de planification, les performances du système seront grandement améliorées.

Quelles sont les caractéristiques du cache, de la rom et de la ram ? Quelles sont les caractéristiques du cache, de la rom et de la ram ? Aug 26, 2022 pm 04:05 PM

Caractéristiques du cache : Une mémoire haute vitesse et de petite capacité à un ou deux niveaux située entre le processeur et la mémoire principale. Les informations sont naturellement perdues lorsque l'ordinateur est mis hors tension. Caractéristiques de la ROM : elle peut uniquement lire les données de la mémoire, mais ne peut pas y écrire d'informations. Les données existeront toujours après la mise hors tension de l'ordinateur. Caractéristiques de la RAM : elle peut lire les données de la mémoire et écrire des informations dans la mémoire ; elle est utilisée pour stocker les commandes, les programmes et les données nécessaires à l'exécution du programme ; les informations sont naturellement perdues lorsque l'ordinateur est éteint.

See all articles