從本篇開始,將進(jìn)一步去分析各組件的實(shí)現(xiàn)細(xì)節(jié),深入CI核心的黑盒內(nèi)部(研究之后,其實(shí)就應(yīng)該是白盒了,僅僅對于應(yīng)用來說,它應(yīng)該算是黑盒),從而更好的去認(rèn)識、把握這個(gè)框架。
按照慣例,在開始之前,我們貼上CI中不完全的核心組件圖:

由于BenchMark是CI中第一個(gè)加載的core組件,因此我們的分析首先從該組件開始。BenchMark的含義非常明確,使用過BenchMark工具的同學(xué)應(yīng)該比較清楚,這是一個(gè)基準(zhǔn)組件。既然是BenchMark,我們便可大膽猜想,BM組件的主要功能就是記錄程序的運(yùn)行時(shí)間、內(nèi)存使用、cpu使用等情況。
先看類圖:

這個(gè)組件結(jié)構(gòu)較簡單,只有一個(gè)marker內(nèi)部變量和三個(gè)對外的接口:
1 Elapsed_time2 Mark3 Memory_usage
下面一個(gè)個(gè)展開來看:
1. mark函數(shù)的簽名為:
function mark($name)
這個(gè)函數(shù)接受一個(gè)string類型的參數(shù),而實(shí)現(xiàn)更簡單,只有一句話:
$this->marker[$name] = microtime();
也就是說這個(gè)函數(shù)只是用于記錄函數(shù)調(diào)用時(shí)刻的時(shí)間點(diǎn)。
值得注意的是,由于Controller中的特殊處理(之后我們會詳細(xì)解釋),你的html' target='_blank'>應(yīng)用程序控制器中可以使用$this->benchmark->mark($name);的方式來添加運(yùn)行的時(shí)間點(diǎn),例如:
$this->benchmark->mark("function_test_start");$this->_test();$this->benchmark->mark("function_test_end");print_r($this->benchmark); 其中,function_test_start和function_test_end分別用于記錄函數(shù)調(diào)用開始和結(jié)束的時(shí)間點(diǎn)
打印出的結(jié)果:

現(xiàn)在要計(jì)算函數(shù)的調(diào)用時(shí)間,需要用到BenchMark組件的第二個(gè)函數(shù)elapsed_time
2. elapsed_time函數(shù)的簽名為:
function elapsed_time($point1 = '', $point2 = '', $decimals = 4)
3個(gè)參數(shù)均為可選參數(shù)
(1). 如果$point1 為空,則返回’{elapsed_time}’
if ($point1 == '') { return '{elapsed_time}';} 納尼!明明應(yīng)該返回的是時(shí)間,怎么反而返回的是字符串,而且這么奇怪(類似smarty的標(biāo)簽)。其實(shí),在Output組件中,{elapsed_time}會被替換,我們暫時(shí)看一下替換的方式:
$elapsed = $BM->elapsed_time('total_execution_time_start', 'total_execution_time_end');$output = str_replace('{elapsed_time}', $elapsed, $output); 也就是說,沒有指定參數(shù)的情況下,調(diào)用該函數(shù)實(shí)際得到的是total_execution_time_start這個(gè)時(shí)間點(diǎn)到total_execution_time_end這個(gè)時(shí)間點(diǎn)的時(shí)間差。更進(jìn)一步,由于total_execution_time_start是在BM加載之后設(shè)置的第一個(gè)mark點(diǎn)(total_execution_time_end并未定義,返回的是當(dāng)前時(shí)間點(diǎn)),該函數(shù)返回的實(shí)際就是系統(tǒng)的加載和運(yùn)行時(shí)間。
(2).如果調(diào)用的是未知的mark點(diǎn)。則結(jié)果是未知的,直接返回空:
if ( ! isset($this->marker[$point1])){ return '';} (3).如果沒有設(shè)置$point2的mark點(diǎn),則將$point2的mark點(diǎn)設(shè)置為當(dāng)前的時(shí)間點(diǎn)。
if ( ! isset($this->marker[$point2])){ $this->marker[$point2] = microtime();} (4).最后返回的兩個(gè)mark點(diǎn)的時(shí)間差:
list($sm, $ss) = explode(' ', $this->marker[$point1]);list($em, $es) = explode(' ', $this->marker[$point2]);return number_format(($em + $es) - ($sm + $ss), $decimals); 還看之前的例子,這里我們可以通過調(diào)用:
echo $this->benchmark->elapsed_time("function_test_start","function_test_end"); 得到函數(shù)的執(zhí)行時(shí)間.
3. memory_usage這個(gè)函數(shù)返回的是系統(tǒng)的內(nèi)存使用情況(MB單位),與{elapsed_time} 一樣,這個(gè)函數(shù)返回的{memory_usage}也會在Output中被替換:
$memory = ( ! function_exists('memory_get_usage')) ? '0' : round(memory_get_usage()/1024/1024, 2).'MB';$output = str_replace('{memory_usage}', $memory, $output); 由于BenchMark組件本身較簡單,我們不做更多的解釋。
最后,貼上這個(gè)組件的源碼:
<?phpclass CI_Benchmark { /** * List of all benchmark markers and when they were added * * @var array */ var $marker = array(); /** * Set a benchmark marker * * @access public * @param string $name name of the marker * @return void */ function mark($name) { $this->marker[$name] = microtime(); } /** * Calculates the time difference between two marked points. * If the first parameter is empty this function instead returns the {elapsed_time} pseudo-variable. This permits the full system * @access public * @param string a particular marked point * @param string a particular marked point * @param integer the number of decimal places * @return mixed */ function elapsed_time($point1 = '', $point2 = '', $decimals = 4) { if ($point1 == '') { return '{elapsed_time}'; } if ( ! isset($this->marker[$point1])) { return ''; } if ( ! isset($this->marker[$point2])) { $this->marker[$point2] = microtime(); } list($sm, $ss) = explode(' ', $this->marker[$point1]); list($em, $es) = explode(' ', $this->marker[$point2]); return number_format(($em + $es) - ($sm + $ss), $decimals); } /** * Memory Usage * This function returns the {memory_usage} pseudo-variable. */ function memory_usage() { return '{memory_usage}'; }}PHP編程
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時(shí)間聯(lián)系我們修改或刪除,多謝。
新聞熱點(diǎn)
疑難解答
圖片精選