欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

php緩沖 output_buffering的使用詳解

 更新時(shí)間:2013年06月13日 10:22:18   作者:  
本篇文章是對(duì)php緩沖output_buffering進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
buffer
buffer是一個(gè)內(nèi)存地址空間,Linux系統(tǒng)默認(rèn)大小一般為4096(4kb),即一個(gè)內(nèi)存頁(yè)。主要用于存儲(chǔ)速度不同步的設(shè)備或者優(yōu)先級(jí)不同的設(shè)備之間傳辦理數(shù)據(jù)的區(qū)域。通過(guò)buffer,可以使進(jìn)程這間的相互等待變少。這里說(shuō)一個(gè)通俗一點(diǎn)的例子,你打開(kāi)文本編輯器編輯一個(gè)文件的時(shí)候,你每輸入一個(gè)字符,操作系統(tǒng)并不會(huì)立即把這個(gè)字符直接寫(xiě)入到磁盤(pán),而是先寫(xiě)入到buffer,當(dāng)寫(xiě)滿了一個(gè)buffer的時(shí)候,才會(huì)把buffer中的數(shù)據(jù)寫(xiě)入磁盤(pán),當(dāng)然當(dāng)調(diào)用內(nèi)核函數(shù)flush()的時(shí)候,強(qiáng)制要求把buffer中的臟數(shù)據(jù)寫(xiě)回磁盤(pán)。

同樣的道理,當(dāng)執(zhí)行echo,print的時(shí)候,輸出并沒(méi)有立即通過(guò)tcp傳給客戶端瀏覽器顯示, 而是將數(shù)據(jù)寫(xiě)入php buffer。php output_buffering機(jī)制,意味在tcp buffer之前,建立了一新的隊(duì)列,數(shù)據(jù)必須經(jīng)過(guò)該隊(duì)列。當(dāng)一個(gè)php buffer寫(xiě)滿的時(shí)候,腳本進(jìn)程會(huì)將php buffer中的輸出數(shù)據(jù)交給系統(tǒng)內(nèi)核交由tcp傳給瀏覽器顯示。所以,數(shù)據(jù)會(huì)依次寫(xiě)到這幾個(gè)地方:echo/print -> php buffer -> tcp buffer -> browser

php output_buffering
默認(rèn)情況下,php buffer是開(kāi)啟的,而且該buffer默認(rèn)值是4096,即4kb。你可以通過(guò)在php.ini配置文件中找到output_buffering配置.當(dāng)echo,print等輸出用戶數(shù)據(jù)的時(shí)候,輸出數(shù)據(jù)都會(huì)寫(xiě)入到php output_buffering中,直到output_buffering寫(xiě)滿,會(huì)將這些數(shù)據(jù)通過(guò)tcp傳送給瀏覽器顯示。你也可以通過(guò)ob_start()手動(dòng)激活php output_buffering機(jī)制,使得即便輸出超過(guò)了4kb數(shù)據(jù),也不真的把數(shù)據(jù)交給tcp傳給瀏覽器,因?yàn)閛b_start()將php buffer空間設(shè)置到了足夠大。只有直到腳本結(jié)束,或者調(diào)用ob_end_flush函數(shù),才會(huì)把數(shù)據(jù)發(fā)送給客戶端瀏覽器。

1.當(dāng)output_buffering=4096,并且輸出較少數(shù)據(jù)(少于一個(gè)buffer)

復(fù)制代碼 代碼如下:

<?php
for ($i = 0; $i < 10; $i++) {
echo $i . '<br/>';
sleep($i + 1); //
}
?>

現(xiàn)象:不是每隔幾秒就會(huì)有間斷性輸出,而是直到響應(yīng)結(jié)束,才能看一次性看到輸出,在等待服務(wù)器腳本處理結(jié)束之前,瀏覽器界面一直保持空白。這是因?yàn)?,?shù)據(jù)量太小,php output_buffering沒(méi)有寫(xiě)滿。寫(xiě)數(shù)據(jù)的順序,依次是echo->php buffer->tcp buffer->browser

2.當(dāng)output_buffering=0,并且輸出較少數(shù)據(jù)(少于一個(gè)buffer)

復(fù)制代碼 代碼如下:

<?php
//通過(guò)ini_set('output_buffering', 0)并不生效
//應(yīng)該編輯/etc/php.ini,設(shè)置output_buffering=0禁用output buffering機(jī)制
//ini_set('output_buffering', 0); //徹底禁用output buffering功能
for ($i = 0; $i < 10; $i++) {
echo $i . '<br/>';
flush(); //通知操作系統(tǒng)底層,盡快把數(shù)據(jù)給客戶端瀏覽器
sleep($i + 1); //
}
?>

現(xiàn)象:與剛才顯示并不一致,禁用了php buffering機(jī)制之后,在瀏覽器可以斷斷續(xù)續(xù)看到間斷性輸出,不必等到腳本執(zhí)行完畢才看到輸出。這是因?yàn)?,?shù)據(jù)沒(méi)有在php output_buffering中停留。寫(xiě)數(shù)據(jù)的順序依次是echo->tcp buffer->browser

3.當(dāng)output_buffering=4096.,輸出數(shù)據(jù)大于一個(gè)buffer,不調(diào)用ob_start()

復(fù)制代碼 代碼如下:

#//創(chuàng)建一個(gè)4kb大小的文件
$dd if=/dev/zero of=f4096 bs=4096 count=1
<?php
for ($i = 0; $i < 10; $i++) {
echo file_get_contents('./f4096') . $i . '<br/>';
sleep($i +1);
}
?>

現(xiàn)象:響應(yīng)還沒(méi)結(jié)束(http連接沒(méi)有關(guān)閉),斷斷續(xù)續(xù)可以看到間斷性輸出,瀏覽器界面不會(huì)一直保持空白。盡管啟用了php output_buffering機(jī)制,但依然會(huì)間斷性輸出,而不是一次性輸出,是因?yàn)閛utput_buffering空間不夠用。每寫(xiě)滿一個(gè)php buffering,數(shù)據(jù)就會(huì)發(fā)送到客戶端瀏覽器。

4.當(dāng)output_buffering=4096, 輸出數(shù)據(jù)大于一個(gè)tcp buffer, 調(diào)用ob_start()

復(fù)制代碼 代碼如下:

<?php
ob_start(); //開(kāi)啟php buffer
for ($i = 0; $i < 10; $i++) {
echo file_get_contents('./f4096') . $i . '<br/>';
sleep($i + 1);
}
ob_end_flush();
?>

現(xiàn)象:直到服務(wù)端腳本處理完成,響應(yīng)結(jié)束,才看到完整輸,輸出間隔時(shí)間很短,以至你感受不到停頓。在輸出之前,瀏覽器一直保持著空白界面,等待服務(wù)端數(shù)據(jù)。這是因?yàn)?,php一旦調(diào)用了ob_start()函數(shù),它會(huì)將php buffer擴(kuò)展到足夠大,直到ob_end_flush函數(shù)調(diào)用或者腳本運(yùn)行結(jié)速才發(fā)送php buffer中的數(shù)據(jù)到客戶端瀏覽器。

output buffering函數(shù)

1.ob_get_level
返回輸出緩沖機(jī)制的嵌套級(jí)別,可以防止模板重復(fù)嵌套自己。

1.ob_start
激活output_buffering機(jī)制。一旦激活,腳本輸出不再直接出給瀏覽器,而是先暫時(shí)寫(xiě)入php buffer內(nèi)存區(qū)域。

php默認(rèn)開(kāi)啟output_buffering機(jī)制,只不過(guò),通過(guò)調(diào)用ob_start()函數(shù)據(jù)output_buffering值擴(kuò)展到足夠大。也可以指定$chunk_size來(lái)指定output_buffering的值。$chunk_size默認(rèn)值是0,表示直到腳本運(yùn)行結(jié)束,php buffer中的數(shù)據(jù)才會(huì)發(fā)送到瀏覽器。如果你設(shè)置了$chunk_size的大小,則表示只要buffer中數(shù)據(jù)長(zhǎng)度達(dá)到了該值,就會(huì)將buffer中的數(shù)據(jù)發(fā)送給瀏覽器。

當(dāng)然,你可以通過(guò)指定$ouput_callback,來(lái)處理buffer中的數(shù)據(jù)。比如函數(shù)ob_gzhandler,將buffer中的數(shù)據(jù)壓縮后再傳送給瀏覽器。

2.ob_get_contents
獲取一份php buffer中的數(shù)據(jù)拷貝。值得注意的是,你應(yīng)該在ob_end_clean()函數(shù)調(diào)用之前調(diào)用該函數(shù),否則ob_get_contents()返回一個(gè)空字符中。

3.ob_end_flush與ob_end_clean
這二個(gè)函數(shù)有點(diǎn)相似,都會(huì)關(guān)閉ouptu_buffering機(jī)制。但不同的是,ob_end_flush只是把php buffer中的數(shù)據(jù)沖(flush/send)到客戶端瀏覽器,而ob_clean_clean將php bufeer中的數(shù)據(jù)清空(erase),但不發(fā)送給客戶端瀏覽器。ob_end_flush調(diào)用之后,php buffer中的數(shù)據(jù)依然存在,ob_get_contents()依然可以獲取php buffer中的數(shù)據(jù)拷貝。而ob_end_clean()調(diào)用之后ob_get_contents()取到的是空字符串,同時(shí)瀏覽器也接收不到輸出,即沒(méi)有任何輸出。

慣用案例
常常在一些模板引擎和頁(yè)面文件緩存中看到ob_start()使用。下面濕CI中加載模板的程序代碼:

復(fù)制代碼 代碼如下:

<SPAN style="WHITE-SPACE: pre">  </SPAN>/*
   * Buffer the output
   *
   * We buffer the output for two reasons:
   * 1. Speed. You get a significant speed boost.
   * 2. So that the final rendered template can be
   * post-processed by the output class.  Why do we
   * need post processing?  For one thing, in order to
   * show the elapsed page load time.  Unless we
   * can intercept the content right before it's sent to
   * the browser and then stop the timer it won't be accurate.
   */
  ob_start();
  // If the PHP installation does not support short tags we'll
  // do a little string replacement, changing the short tags
  // to standard PHP echo statements.
  if ((bool) @ini_get('short_open_tag') === FALSE AND config_item('rewrite_short_tags') == TRUE)
  {
                        //替換短標(biāo)記<?=***>
   echo eval('?>'.preg_replace("/;*\s*\?>/", "; ?>", str_replace('<?=', '<?php echo ', file_get_contents($_ci_path))));
  }
  else
  {
   include($_ci_path); // include() vs include_once() allows for multiple views with the same name
  }

                //記錄調(diào)試信息
  log_message('debug', 'File loaded: '.$_ci_path);
  // Return the file data if requested
  if ($_ci_return === TRUE)
  {
   $buffer = ob_get_contents();
   @ob_end_clean();
   return $buffer;
  }
  /*
   * Flush the buffer... or buff the flusher?
   *
   * In order to permit views to be nested within
   * other views, we need to flush the content back out whenever
   * we are beyond the first level of output buffering so that
   * it can be seen and included properly by the first included
   * template and any subsequent ones. Oy!
   *
   */
  if (ob_get_level() > $this->_ci_ob_level + 1)
  {
   ob_end_flush();
  }
  else
  {
                        //將模板內(nèi)容添加到輸出流中
   $_ci_CI->output->append_output(ob_get_contents());
                        //清除buffer
   @ob_end_clean();
  }

相關(guān)文章

  • Zend的AutoLoad機(jī)制介紹

    Zend的AutoLoad機(jī)制介紹

    在使用zend framework的時(shí)候,最先引入的一定是AutoLoad的機(jī)制,這里就想分析下Zend的AutoLoad是怎么引入的
    2012-09-09
  • php xml 入門(mén)學(xué)習(xí)資料

    php xml 入門(mén)學(xué)習(xí)資料

    今天做項(xiàng)目時(shí)遇到一個(gè)問(wèn)題:需要?jiǎng)討B(tài)更新主頁(yè)上的圖片,以示本站不是做完了就算了,是有人一直在維護(hù)。好了,需求有了,如何實(shí)現(xiàn)?!
    2011-01-01
  • php mysql_list_dbs()函數(shù)用法示例

    php mysql_list_dbs()函數(shù)用法示例

    這篇文章主要介紹了php mysql_list_dbs()函數(shù)用法,簡(jiǎn)單介紹了mysql_list_dbs()函數(shù)的功能及列出mysql所有數(shù)據(jù)庫(kù)的實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-03-03
  • Thinkphp實(shí)現(xiàn)自動(dòng)驗(yàn)證和自動(dòng)完成

    Thinkphp實(shí)現(xiàn)自動(dòng)驗(yàn)證和自動(dòng)完成

    這篇文章主要介紹了Thinkphp實(shí)現(xiàn)自動(dòng)驗(yàn)證和自動(dòng)完成的相關(guān)資料,需要的朋友可以參考下
    2015-12-12
  • 簡(jiǎn)化php模板頁(yè)面中分頁(yè)代碼的解析

    簡(jiǎn)化php模板頁(yè)面中分頁(yè)代碼的解析

    這篇文章主要是針對(duì)“使用模板的情況”寫(xiě)的, 但是這種方法適合于任何的場(chǎng)合,在任何情況下都是一種比較好的解決方案
    2009-02-02
  • 修改Laravel5.3中的路由文件與路徑

    修改Laravel5.3中的路由文件與路徑

    本文先是回顧了Laravel5.2中路由的修改,然后給大家用實(shí)例代碼介紹了如何修改Laravel5.3中的路由,有需要的小伙伴們可以參考學(xué)習(xí)。
    2016-08-08
  • PHP優(yōu)于Node.js的五大理由分享

    PHP優(yōu)于Node.js的五大理由分享

    PHP是一款服務(wù)器端的腳本語(yǔ)言,主要用于動(dòng)態(tài)網(wǎng)頁(yè)開(kāi)發(fā),是目前最流行的開(kāi)發(fā)語(yǔ)言之一。Node是一款用來(lái)編寫(xiě)高性能網(wǎng)絡(luò)服務(wù)器的JavaScript工具包
    2012-09-09
  • 利用PHP擴(kuò)展Xhprof分析項(xiàng)目性能實(shí)踐教程

    利用PHP擴(kuò)展Xhprof分析項(xiàng)目性能實(shí)踐教程

    XHProf是Facebook開(kāi)發(fā)的性能調(diào)試工具,能幫助直觀的統(tǒng)計(jì)顯示PHP程序執(zhí)行中各方法函數(shù)調(diào)用次數(shù)和消耗時(shí)間,以方便我們排查性能瓶頸并進(jìn)行調(diào)優(yōu)。下面這篇文章主要給大家介紹了關(guān)于利用PHP擴(kuò)展Xhprof分析項(xiàng)目性能實(shí)踐的相關(guān)資料,需要的朋友可以參考下
    2018-09-09
  • php刪除路徑下的所有文件夾和文件的代碼

    php刪除路徑下的所有文件夾和文件的代碼

    這篇文章主要介紹了php刪除路徑下的所有文件夾和文件的代碼的相關(guān)資料(php清空目錄代碼),需要的朋友可以參考下
    2023-03-03
  • php數(shù)據(jù)流中第K大元素的計(jì)算方法及代碼分析

    php數(shù)據(jù)流中第K大元素的計(jì)算方法及代碼分析

    在本篇文章里小編給大家整理了一篇關(guān)于php數(shù)據(jù)流中第K大元素的計(jì)算方法及代碼分析內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2021-07-07

最新評(píng)論