PHP 輸出緩沖控制(Output Control)詳解
php 緩沖簡介
其實我對php ob 系列印象還是很模糊,具體怎么玩的,還不是很了解,平時curd,確實對這些內(nèi)容沒有深入。作為phper 甚是慚愧。網(wǎng)上搜了一通,互相copy,代碼運(yùn)行不能出現(xiàn)作者所描述現(xiàn)象,本文良心出品,代碼都是作者運(yùn)行過。
當(dāng)執(zhí)行輸出的時候,比如 echo,print。輸出并沒有立即送給 web server, 而是將數(shù)據(jù)寫入 php buffer。php output_buffering 機(jī)制好處當(dāng)然提升性能。其實 php 文件最終在瀏覽器上顯示,走過3個緩沖階段: php buffer=》web server buffer=》browser buffer。 最后顯示到瀏覽器
默認(rèn)情況下,php buffer 是開啟的,而且該 buffer 默認(rèn)值是4096,即4 kb。你可以通過在php.ini配置文件中找到output_buffering配置。buffer是一個內(nèi)存地址空間,Linux系統(tǒng)默認(rèn)大小一般為4096(4kb),即一個內(nèi)存頁。主要用于存儲速度不同步的設(shè)備或者優(yōu)先級不同的設(shè)備之間傳辦理數(shù)據(jù)的區(qū)域。通過buffer,可以使進(jìn)程這間的相互等待變少。這里說一個通俗一點的例子,你打開文本編輯器編輯一個文件的時候,你每輸入一個字符,操作系統(tǒng)并不會立即把這個字符直接寫入到磁盤,而是先寫入到buffer,當(dāng)寫滿了一個buffer的時候,才會把buffer中的數(shù)據(jù)寫入磁盤,當(dāng)然當(dāng)調(diào)用內(nèi)核函數(shù)flush()的時候,強(qiáng)制要求把buffer中的臟數(shù)據(jù)寫回磁盤。
舉個例子
<?php
echo "南無阿彌陀佛<br>";
header("content-type:text/html;charset='utf-8'");
echo "真善忍好!";
//output
//南無阿彌陀佛
//真善忍好
header()必須在任何實際輸出之前調(diào)用,但是我們程序已經(jīng)輸出了,卻正常運(yùn)行。在看下面的代碼:
<?phpecho "南無阿彌陀佛<br>";
ob_flush();
header("content-type:text/html;charset='utf-8'");
echo "真善忍好!";
//output
//南無阿彌陀佛
//Cannot modify header information - headers already sent by (output started at E:\php\test.php:3)
//真善忍好
上面程序說明程序并沒有立即輸出,而當(dāng)調(diào)用ob_flush 函數(shù)的時候才刷新緩沖,輸出。
ob_flush() 與 flush()
ob_flush() , flush() 函數(shù)php 手冊上都有詳細(xì)的說明,你可以去查閱一下。二者的區(qū)別是:
ob_flush() 是刷新PHP自身的緩沖區(qū)
flush()是 它是刷新WebServer 服務(wù)器的緩沖。輸出到瀏覽器。但是會出現(xiàn)下面的情況:
- 個別web服務(wù)器程序,特別是Win32下的web服務(wù)器程序,在發(fā)送結(jié)果到瀏覽器之前,仍然會緩存腳本的輸出,直到程序結(jié)束為止。
- 有些Apache的模塊,比如mod_gzip,可能自己進(jìn)行輸出緩存,這將導(dǎo)致flush()函數(shù)產(chǎn)生的結(jié)果不會立即被發(fā)送到客戶端瀏覽器。
- 甚至瀏覽器也會在顯示之前,緩存接收到的內(nèi)容。例如 Netscape 瀏覽器會在接受到換行或 html 標(biāo)記的開頭之前緩存內(nèi)容,并且在接受到 </table> 標(biāo)記之前,不會顯示出整個表格。
- 一些版本的 Microsoft Internet Explorer 只有當(dāng)接受到的256個字節(jié)以后才開始顯示該頁面,所以必須發(fā)送一些額外的空格來讓這些瀏覽器顯示頁面內(nèi)容。
比如:
<?php /** Server:LightTPD/1.4.28 (Win32) X-Powered-By:PHP/5.3.27 */ echo '佛法無邊'."<BR>"; ob_flush(); flush(); sleep(1); echo '法輪常轉(zhuǎn)'; //output
上面的代碼 在 chrome 瀏覽器上面 是一行一行的輸出,在ie系列的瀏覽器則是全部輸出。其實就是上面的 第四條一些瀏覽器只有當(dāng)接收256個字符才開始顯示。把上面的代碼改成下面形式:
<?php
/**
Server:LightTPD/1.4.28 (Win32)
X-Powered-By:PHP/5.3.27
*/
echo str_pad('',240)."\n";
echo '佛法無邊'."<BR>";
ob_flush();
flush();
sleep(1);
echo '法輪常轉(zhuǎn)';
//output
這樣在ie下面就會一行一行輸出,因為超過256個字符。
ob 其他函數(shù)說明
1.ob_end_flush 與 ob_end_clean
end 的顧名思義就結(jié)束,關(guān)閉緩沖區(qū),都是關(guān)閉輸出緩沖,一個是輸出緩沖區(qū),一個是清除。比如
<?php
/**
Server:LightTPD/1.4.28 (Win32)
X-Powered-By:PHP/5.3.27
*/
echo 'before';
ob_end_clean();
echo str_pad('',4096)."\n";
for ($i=10; $i>0; $i--)
{
echo $i;
sleep(1);
}
上述代碼是一下輸出全部內(nèi)容,而不是一個一個輸出。ob_end_clean() 不是關(guān)閉了緩沖了?怎么不是一個一個輸出呢,其實我們上面也說了,php 不是直接輸出給瀏覽器,而是 web server。 雖然php 沒有了 緩沖。但是web server 還是有的。所以下面代碼:
/**
Server:LightTPD/1.4.28 (Win32)
X-Powered-By:PHP/5.3.27
*/
echo 'before';
ob_end_clean();
echo str_pad('',4096)."\n";
for ($i=10; $i>0; $i--)
{
flush();
echo $i;
sleep(1);
}
加上flush(),就會一行一行輸出。 如果把ob_end_clean 換成 ob_end_flush 會把 before 輸出來。
其他函數(shù) 可參考手冊,比較簡單。
總結(jié)
php 腳本到瀏覽器,要經(jīng)過 php buffer=》web server buffer=》browser buffer。 最后顯示到瀏覽器。 缺一不可。 所以我們要 ob_flush 和 flush 以及加上 echo str_pad('',4096) 才能調(diào)試出你想要的效果。
以上就是對PHP 緩沖的資料整理后續(xù)繼續(xù)補(bǔ)充相關(guān)資料,謝謝大家對本站的支持!
相關(guān)文章
深入解析PHP垃圾回收機(jī)制對內(nèi)存泄露的處理
本篇文章是關(guān)于PHP垃圾回收機(jī)制對內(nèi)存泄露的處理進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
php實現(xiàn)QQ空間獲取當(dāng)前用戶的用戶名并生成圖片
這篇文章主要介紹了php實現(xiàn)QQ空間獲取當(dāng)前用戶的用戶名并生成圖片的方法,涉及php針對QQ空間及接口調(diào)用的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-07-07
PHP實現(xiàn)數(shù)據(jù)庫統(tǒng)計時間戳按天分組輸出數(shù)據(jù)的方法
這篇文章主要介紹了PHP實現(xiàn)數(shù)據(jù)庫統(tǒng)計時間戳按天分組輸出數(shù)據(jù)的方法,涉及php基于時間的運(yùn)算與數(shù)據(jù)庫查詢相關(guān)操作技巧,需要的朋友可以參考下2017-10-10
is_uploaded_file函數(shù)引發(fā)的不能上傳文件問題
不能上傳文件,都返回失敗。經(jīng)過排查發(fā)現(xiàn)是PHP中的is_uploaded_file函數(shù)在搗鬼,下面是具體的處理方法,有類似情況的朋友可以參考下2013-10-10
PHP里面把16進(jìn)制的圖片數(shù)據(jù)顯示在html的img標(biāo)簽上(實現(xiàn)方法)
下面小編就為大家?guī)硪黄狿HP里面把16進(jìn)制的圖片數(shù)據(jù)顯示在html的img標(biāo)簽上(實現(xiàn)方法)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05
php文件包含目錄配置open_basedir的使用與性能詳解
下面小編就為大家?guī)硪黄猵hp文件包含目錄配置open_basedir的使用與性能詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-04-04

