ホームページ  >  記事  >  バックエンド開発  >  CI フレームワークのソース コードの読み取り----------Output.php_PHP チュートリアル

CI フレームワークのソース コードの読み取り----------Output.php_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-14 10:09:18915ブラウズ

[php]  

/** 
* コードイグナイター
*
* PHP 5.1.6 以降用のオープンソース アプリケーション開発フレームワーク
*
* @package CodeIgniter
* @author ExpressionEngine 開発チーム
* @copyright Copyright (c) 2008 - 2011, EllisLab, Inc.
* @license http://codeigniter.com/user_guide/license.html
* @link http://codeigniter.com
* @since バージョン 1.0
* @filesource
 */
// ----------------------------------------------- ------------------------
/**
* 出力クラス
*
* 最終出力をブラウザに送信する責任があります
* 最終出力をブラウザに送信する責任があります
* @パッケージCodeIgniter
* @subpackage ライブラリ
* @category 出力
* @author ExpressionEngine 開発チーム
* @link http://codeigniter.com/user_guide/libraries/output.html
*/
クラス CI_Output {
/**
* 現在の出力文字列
* 現在の出力文字列
*
* @var 文字列
* @access 保護されています
*/
protected $final_output;  
/**
* キャッシュの有効期限
* キャッシュの有効期限
* @var int
* @access 保護されています
*/
protected $cache_expiration = 0;  
/**
* サーバーヘッダーのリスト
* サーバーヘッダーリスト
* @var 配列
* @access 保護されています
*/
protected $headers = array();  
/** 
* MIME タイプのリスト
*
* @var 配列
* @access protected
     */
protected $mime_types = array();  
/**
* プロファイラーが有効かどうかを決定します
* アナライザーを有効にするかどうか
* @var本
* @access 保護されています
*/
protected $enable_profiler = FALSE;  
/**
* 出力圧縮が有効かどうかを決定します
* 出力圧縮を有効にするかどうか
* @var bool
* @access 保護されています
*/
protected $_zlib_oc = FALSE;  
/**
* プロファイラーセクションのリスト
* アナライザーリスト
*
* @var 配列
* @access 保護されています
*/
protected $_profiler_sections = array();  
/**
* {elapsed_time} や {memory_usage} などの変数を解析するかどうか
* 否か解析变量{elapsed_time}と{memory_usage}
* 注意文档说这里有错详见http://codeigniter.org.cn/user_guide/libraries/output.html
*最下方
* @var bool
* @access 保護されています
*/
保護された $parse_exec_vars = TRUE
/** 
* コンストラクター
*
     */
関数__construct()
{
置 // 設定項目 zlib.output_compression の値を返し、それを $this- & _zlib_oc に渡します
;
// 設定項目で出力圧縮機能がオンになっている場合、$this->_zlib_oc の値はオンになります
$this->_zlib_oc = @ini_get('zlib.output_compression');
// 後で使用するために MIME タイプを取得します
// MIME タイプを取得します
if (define('ENVIRONMENT') AND file_exists(APPPATH.'config/'.ENVIRONMENT.'/mimes.php'))
APPPATH.'config/'.ENVIRONMENT.'/mimes.php' をインクルードします
}
その他
APPPATH.'config/mimes.php' をインクルードします
}
// $mimes は mimes.php で定義された配列です
$this->mime_types = $mimes;
Log_message('debug', "出力クラスが初期化されました");
}
// ----------------------------------------------- --- --------------------------
/**
* 出力を取得する
* この方法を使用すると、出力するデータを取得して保存することができます
* 現在の出力文字列を返します
* 現在の出力文字列を返します
* @アクセス公開
* @戻り文字列
*/
関数get_output()
{
️戻る-- $this を返す->FINAL_OUTPUT;
}
// ----------------------------------------------- --- --------------------------
/**
* 出力を設定します
*
* 出力文字列を設定します
* 出力文字列を設定します
* @アクセス公開
* @パラメータ文字列
* @return void
*/
関数 set_output($output)
{
$this->final_output = $output;
$this を返します。
}
// ----------------------------------------------- --- --------------------------
/**
* 出力を追加
* 最終出力文字列の後にデータを追加します
* 出力文字列にデータを追加します
*
* @アクセス公開
* @パラメータ文字列
* @return void
*/
関数append_output($output)
{
if ($this->final_output == '')
$this->final_output = $output;
}
その他
$this->final_output .= $output;  
}
$this を返します。  
}
// ----------------------------------------------- ---------------------
/**
* ヘッダーを設定します
* このメソッドを使用すると、ブラウザに送信する HTTP プロトコルのヘッダーを設定できます。これは、PHP の標準関数 header() に相当します。
* 最終的な表示で出力されるサーバーヘッダーを設定できます。
* 最終的な表示出力のサーバーヘッダーを設定できます。
* 注: ファイルがキャッシュされている場合、ヘッダーは送信されないことを理解する必要があります
* ヘッダーデータをキャッシュデータと一緒に保存することを許可する方法...
*
* @アクセス公開
* @パラメータ文字列
* @param bool
* @return void
*/
function set_header($header, $replace = TRUE)
{
// zlib.output_compression が有効な場合、出力が圧縮されます。
// ただし、
の补偿を補うためにコンテンツ長ヘッダーは変更されません
// 削減减少还原により、追加のデータを待機している間にブラウザがハングします。  
// そのような場合は、content-length をスキップします。  
if ($this->_zlib_oc && strncasecmp($header, 'content-length', 14) == 0)
{
戻る;  
}
$this->headers[] = array($header, $replace);  
$this を返します。  
}
// ----------------------------------------------- ---------------------
/** 
* コンテンツ タイプ ヘッダーを設定します
* 設置Content-Type
* @access public
* @param 文字列 出力するファイルの拡張子
* @return void
     */
関数 set_content_type($mime_type)
{
if (strpos($mime_type, '/') === FALSE)
{
$extension = ltrim($mime_type, '.');  
// この拡張機能はサポートされていますか?  
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);  
$this を返します。  
}
// ----------------------------------------------- ---------------------
/**
* HTTP ステータス ヘッダーを設定します
* 1.7.2 の共通手続き関数に移動
* 允许你手動设置服务器状態态头(ヘッダー)
* @access public
* @param int ステータスコード
* @param string
* @return void
*/
function set_status_header($code = 200, $text = '')
{
set_status_header($code, $text);  
$this を返します。  
}
// ----------------------------------------------- ---------------------
/**
* プロファイラーを有効/無効にする
* アナライザーを有効または無効にすることができます
* @アクセス公開
* @param bool
* @return void
*/
関数enable_profiler($val = TRUE)
{
$this->enable_profiler = (is_bool($val)) ? $val : TRUE;  
$this を返します。  
}
// ----------------------------------------------- ---------------------
/**
* プロファイラーセクションを設定する
* $this->_profiler_sections を設定します
* プロファイラー セクション表示のデフォルト/構成設定の上書きを許可します
* 有効になっている場合、レビューアーの特定の部分を制御 (オン/オフ) できます
*
* @アクセス公開
* @param配列
* @return void
*/
関数 set_profiler_sections($sections)
{
foreach ($sections as $section => $enable)
{
$this->_profiler_sections[$section] = ($enable !== FALSE) ?真/偽;  
}
$this を返します。  
}
// ----------------------------------------------- ---------------------
/**
* キャッシュを設定する
* キャッシュとキャッシュ時間を設定します
* @アクセス公開
* @param integer $time はキャッシュを更新する分数です
* @return void
*/
関数キャッシュ($time)
{
$this->cache_expiration = ( ! is_numeric($time)) ? 0 : $時間;  
$this を返します。  
}
// ----------------------------------------------- ---------------------
/**
* ディスプレイ出力
* 显示输出
* すべての「ビュー」データは、コントローラー クラスによって自動的にこの変数に入れられます:
*
* $this->final_output
*
* この関数は、最終的な出力データをブラウザに送信します
* サーバーヘッダーとプロファイルデータを含みます。  
も停止します
* ページのレンダリング速度とメモリ使用量を表示できるベンチマーク タイマー。 
*
* @access public
* @パラメータ文字列
* @return 混合
*/
関数 _display($output = '')
{
// 注: $CI =& get_instance() を使用できないため、グローバルを使用します
// この関数はキャッシュメカニズムによって呼び出される場合があるため、
// これは CI スーパー オブジェクトが利用可能になる前に発生します
グローバル $BM、$CFG
// 可能であればスーパー オブジェクトを取得します
// // もちろん、スーパーコントローラーが手に入るなら、まずそれを手に入れます。
if (class_exists('CI_Controller'))
$CI =& get_instance();
}
--------------------------------------
// 出力データを設定します
if ($output == '')
$output =& $this->final_output;
}
--------------------------------------
// コントローラーに
がない場合にのみ、キャッシュ ファイルを書き込む必要がありますか?
// 独自の _output() メソッドであり、キャッシュ ファイルを扱っていません。
// 上記の $CI オブジェクトの存在によって判断できます
// キャッシュ時間 > 0 の場合、$ CI スーパー オブジェクトが存在し、そのスーパー オブジェクトの下に _output メソッドが存在します
// _write_cache メソッドを呼び出してキャッシュ ファイルを書き込みます
if ($this->cache_expiration > 0 && isset($CI) && ! Method_exists($CI, '_output'))
$this->_write_cache($output);
}
--------------------------------------
// 経過時間とメモリ使用量を解析します。
// 次に、疑似変数をデータと交換します
// コードの実行時間とメモリ使用時間を計算します
$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)
;
$output = str_replace('{elapsed_time}', $elapsed, $output);
$output = str_replace('{memory_usage}', $memory, $output);
}
--------------------------------------
// 圧縮送信の処理が要求されていますか?
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');  
}
}
}
// ------------------------------------------- ---------------------
// 送信するサーバー ヘッダーはありますか?  
// 有没服务器头発行?
if (count($this->headers) > 0)
{
foreach ($this->headers as $header)
{
@header($header[0], $header[1]);  
}
}
// ------------------------------------------- ---------------------
// $CI オブジェクトは存在しますか?  
// そうでない場合は、キャッシュ ファイルを扱っていることがわかっているため、
// データをエコーアウトして終了します。  
// 如果無し$CI就证明当前是一存存出,我们只简单的送信データ据并退出
if ( ! isset($CI))
{
echo $output;  
log_message('debug', "ブラウザに送信された最終出力");  
log_message('debug', "合計実行時間: ".$elapsed);  
TRUE を返します。  
}
// ------------------------------------------- ---------------------
// プロファイル データを生成する必要がありますか?  
// その場合は、Profile クラスをロードして実行します。  
// 如果开启了性能分析我们就调用、
// 会議は、私を助けるためにいくつかの報告を面尾部に生成します。
if ($this->enable_profiler == TRUE)
{
$CI->load->library('profiler');  
if ( ! emptyempty($this->_profiler_sections))
{
$CI->profiler->set_sections($this->_profiler_sections);  
}
// 出力データに終了 が含まれる場合タグ
// プロフィール データを挿入した後、それらを削除し、再度追加します
// 如果标签、我们将删除、插入我们的性能分析代码後再追加回去
if (preg_match("|.*?|is", $output))
{
$output = preg_replace("|.*?|is", '', $output);  
$output .= $CI->profiler->run();  
$output .= '';
}
その他
$output .= $CI->profiler->run();
}
}
--------------------------------------
を使用して
// そうでない場合は、出力をそこに送信します。
中 // コントローラーに _output メソッドがある場合は、直接呼び出します
// データがブラウザに直接送信されない場合
if (method_exists($CI, '_output'))
$CI->_output($output);
}
その他
️ echo $output;
}
Log_message('debug', "ブラウザに送信された最終出力");
Log_message('debug', "合計実行時間: ".$elapsed);
}
// ----------------------------------------------- --- --------------------------
/**
* キャッシュファイルを書き込む
* キャッシュファイルを生成します
* @アクセス公開
* @パラメータ文字列
* @return void
*/
関数_write_cache($output)
{
cusingの使用
$CI =& get_instance();
// キャッシュパスを検索します
$path = $CI->config->item('cache_path');
$cache_path = ($path == '') APPPATH.'cache/' : $path;
// キャッシュ パスがフォルダーではない場合、または書き込みできない場合は、エラーが返されます。
if ( ! is_dir($cache_path) OR ! is_really_writable($cache_path))
log_message('error', "キャッシュ ファイルを書き込めません: ".$cache_path);
}
// $uri を取得します
$uri = $CI->config->item('base_url')
$CI->config->item('index_page')
$CI->uri->uri_string();
// キャッシュ ファイルを生成します。
$cache_path .= md5($uri);
if ( ! $fp = @fopen($cache_path, FOPEN_WRITE_CREATE_DESTRUCTIVE))
log_message('error', "キャッシュ ファイルを書き込めません: ".$cache_path);
戻る;
}
// キャッシュ ファイルの有効期限を計算します。
$expire = time() + ($this->cache_expiration * 60);
if (flock($fp, LOCK_EX))
{
fwrite($fp, $expire.'TS--->'.$output);  
flock($fp, LOCK_UN);  
}
その他
{
log_message('error', "次のファイルのファイル ロックを保護できません: ".$cache_path);  
戻る;  
}
fclose($fp);  
@chmod($cache_path, FILE_WRITE_MODE);  
log_message('debug', "書き込まれたキャッシュ ファイル: ".$cache_path);  
}
// ----------------------------------------------- ---------------------
/**
* キャッシュされたファイルを更新/提供します
* このメソッドは CodeIgniter.php で呼び出されます。このメソッドは出力をキャッシュします。
* CodeIgniter.php でこのメソッドを呼び出したときに出力がある場合、
* このリクエストの実行は直接終了し、キャッシュされた出力が直接応答されます。
*
* @アクセス公開
* @param オブジェクト構成クラス
* @param オブジェクト URI クラス
* @return void
*/
function _display_cache(&$CFG, &$URI)
{
// 保存保存経路径
$cache_path = ($CFG->item('cache_path') == '') ? APPPATH.'cache/' : $CFG->item('cache_path');  
// ファイルパスを構築します。  ファイル名は完全な URI の MD5 ハッシュです
// 1 つの保存ファイルに対する 1 つの標準の経路指定ファイル、保存ファイルは経路指定文字列に対する md5 暗号化です。
$uri = $CFG->item('base_url')。  
$CFG->item('index_page')。  
$URI->uri_string;  
$filepath = $cache_path.md5($uri);  
// この保存ファイルがない場合は、保存コンテンツが失われているため、FALSE を返すことができます。
if ( ! @file_exists($filepath))
{
FALSE を返します。  
}
// 保存されたファイルが存在するが、許可されていない場合は、保存されたコンテンツが失われ、同様に FALSE が返されます。
if ( ! $fp = @fopen($filepath, FOPEN_READ))
{
FALSE を返します。  
}
// 保存されているファイルにアクセスし、$fp を句文として使用します。次に、共有锁(读取)を取得します。
flock($fp, LOCK_SH);  
$cache = '';  
if (filesize($filepath) > 0)
{
$cache = fread($fp, filesize($filepath));  
}
// 解锁
flock($fp, LOCK_UN);  
// 关闭ファイル接続。
fclose($fp);  
// 以下このTS--->字样、只是CIの保存文書の内容
// 数字 + TS ---> 値で指定されています。この数字は作成時間を表します。
// この構造に準拠していない場合は、非 CI キャッシュ ファイルとみなされるか、ファイルが破損している可能性があります。
// キャッシュコンテンツの取得に失敗し、FALSE を返します。
// 埋め込まれたタイムスタンプを削除します
if ( ! preg_match("/(d+TS--->)/", $cache, $match))
FALSE を返します。
}
// ファイルの有効期限が切れている場合は削除します。
// キャッシュの有効期限が切れているかどうかを判断し、期限が切れた場合は削除します
if (time() >= trim(str_replace('TS--->', '', $match['1'])))
if (is_really_writable($cache_path))
@unlink($filepath);
log_message('debug', "キャッシュ ファイルの有効期限が切れました。ファイルは削除されました");
FALSE を返します。
}
}
// キャッシュを表示します
$this->_display(str_replace($match['0'], '', $cache));
Log_message('debug', "キャッシュ ファイルは現在のものです。ブラウザに送信しています。");
TRUE を返します
}
}
// 出力クラスの終了
/* ファイルの終わり Output.php */
/* 場所: ./system/core/Output.php */
http://www.bkjia.com/PHPjc/477678.html
www.bkjia.com
本当
http://www.bkjia.com/PHPjc/477678.html

技術記事 [php] ?php if ( !定義(BASEPATH)) exit(直接スクリプトアクセスは許可されません); /** * CodeIgniter * * PHP 5.1.6以降用のオープンソースアプリケーション開発フレームワーク * * @packag...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。