PHP緩衝機制Output Control詳解

來源:互聯網
上載者:User

標籤:

這篇文章主要介紹了PHP緩衝機制Output Control,需要的朋友可以參考下

在php5.2版本的配置中,預設output_buffering為關閉狀態,因此運行下面三行代碼將會出現一個警告:
Warning: Cannot modify header information - headers already sent

echo ‘hello1‘;header(‘content-type:text/html;charset=utf-8‘);echo ‘hello2‘; 

開啟OB緩衝的方式有如下兩種:

1. php.ini中開啟 output_buffering = 4096

啟用了此指令,那麼每個PHP指令碼都相當於一開始就調用了ob_start()函數,PHP5.5預設已開啟output_buffering = 4096

2. 直接在程式中使用 ob_start();

開啟輸出緩衝。當輸出緩衝啟用後,指令碼將不會輸出內容(除http標題外),相反需要輸出的內容被儲存在內部緩衝區中。

內部緩衝區的內容可以用 ob_get_contents() 函數複製到一個字串變數中。 想要輸出儲存在內部緩衝區中的內容,可以使用 ob_end_flush() 函數。另外, 使用 ob_end_clean() 函數會靜默丟棄掉緩衝區的內容。

/** * output_buffering = off 情況下測試 */ob_start();  //開啟ob緩衝echo ‘hello1‘; //存入ob緩衝header(‘content-type:text/html;charset=utf-8‘);//存入程式緩衝//ob_end_clean(); //清空ob緩衝,並關閉ob緩衝echo ‘hello2‘; //存入ob緩衝$str = ob_get_contents(); //返回ob緩衝的資料(不清除緩衝內容)file_put_contents(‘ob.txt‘, $str); //把$str儲存到檔案//ob_clean(); //清空ob緩衝echo ‘hello3‘; //存入ob緩衝echo ‘hello4‘; //存入ob緩衝/* 此指令碼將產生ob.txt檔案,存入hello1hello2,瀏覽器輸出hello1hello2hello3hello4 *//* 若ob_clean()注釋開啟,那麼產生的ob.txt檔案中將沒有內容,瀏覽器輸出hello3hello4 *//* 若ob_end_clean()注釋開啟,那麼ob.txt中依然沒有內容,因為關閉了ob緩衝,瀏覽器輸出hello2hello3hello4 */

ob_flush() 與 ob_end_flush() 例子:

ob_start();echo ‘abc‘;//存入ob緩衝header(‘content-type:text/html;charset=utf-8‘); //存入程式緩衝echo ‘hello‘; //存入ob緩衝ob_flush();//將ob緩衝中的內容輸出到程式緩衝,清空ob緩衝,不關閉ob緩衝//ob_end_flush() //將ob緩衝中的內容輸出到程式緩衝,清空ob緩衝,關閉ob緩衝echo ‘aa‘; //存入ob緩衝echo ob_get_contents();/* 最後輸出abchelloaaaa *//* 注釋ob_flush,開啟ob_end_flush,最後輸出abchelloaa */

注意:
在output_buffering = 4096開啟的情況下,ob_end_clean()只關閉一次ob緩衝(即ob_start開啟的),系統的並未關閉。
ob_end_flush()同理。

OB緩衝的運行原理/原則:

1. ob緩衝開啟,echo的資料首先放入ob緩衝(Xee:資料一般在記憶體存放,然後接收到echo命令進行輸出!)
2. 如果是header資訊,直接放在程式緩衝
3. 當頁面執行到最後,會把ob緩衝的資料放到程式緩衝,然後一次返回給瀏覽器

最後還有一個flush(); 強制重新整理PHP程式緩衝到瀏覽器緩衝。

特性:一些版本的 Microsoft Internet Explorer 只有當接受到的256個位元組以後才開始顯示該頁面,所以必鬚髮送一些額外的空格來讓這些瀏覽器顯示頁面內容。

echo str_repeat(‘‘, 1024);//重複輸出多個字元(解決瀏覽器緩衝256位元組之後再輸出的情況)for($i=0; $i < 5; $i++){echo $i;flush();    //強制重新整理程式緩衝到瀏覽器緩衝sleep(1);  //休眠1秒鐘,http串連未斷開,每隔1秒輸出$i}

<參考:http://www.jb51.net/article/52119.htm>

PHP緩衝機制Output Control詳解

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.