您好,登錄后才能下訂單哦!
PHP中怎么實現輸出緩沖控制,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
PHP輸出緩沖控制是什么
默認情況下,phpbuffer是開啟的,而且該buffer默認值是4096,即4kb。你可以通過在php.ini配置文件中找到output_buffering配置。buffer是一個內存地址空間,Linux系統默認大小一般為4096(4kb),即一個內存頁。主要用于存儲速度不同步的設備或者優先級不同的設備之間傳辦理數據的區域。通過buffer,可以使進程這間的相互等待變少。這里說一個通俗一點的例子,你打開文本編輯器編輯一個文件的時候,你每輸入一個字符,操作系統并不會立即把這個字符直接寫入到磁盤,而是先寫入到buffer,當寫滿了一個buffer的時候,才會把buffer中的數據寫入磁盤,當然當調用內核函數flush()的時候,強制要求把buffer中的臟數據寫回磁盤。
PHP輸出緩沖控制代碼怎么寫
echo"南無阿彌陀佛
";
header("content-type:text/html;charset='utf-8'");
echo"真善忍好!";
//output
//南無阿彌陀佛
//真善忍好
header()必須在任何實際輸出之前調用,但是我們程序已經輸出了,卻正常運行。在看下面的代碼:
echo"南無阿彌陀佛
";
ob_flush();
header("content-type:text/html;charset='utf-8'");
echo"真善忍好!";
//output
//南無阿彌陀佛
//Cannotmodifyheaderinformation-headersalreadysentby(outputstartedatE:\php\test.php:3)
//真善忍好
上面程序說明程序并沒有立即輸出,而當調用ob_flush函數的時候才刷新緩沖,輸出。
ob_flush()與flush()
ob_flush(),flush()函數php手冊上都有詳細的說明,你可以去查閱一下。二者的區別是:
ob_flush()是刷新PHP自身的緩沖區
flush()是它是刷新WebServer服務器的緩沖。輸出到瀏覽器。但是會出現下面的情況:
個別web服務器程序,特別是Win32下的web服務器程序,在發送結果到瀏覽器之前,仍然會緩存腳本的輸出,直到程序結束為止。有些Apache的模塊,比如mod_gzip,可能自己進行輸出緩存,這將導致flush()函數產生的結果不會立即被發送到客戶端瀏覽器。甚至瀏覽器也會在顯示之前,緩存接收到的內容。例如Netscape瀏覽器會在接受到換行或html標記的開頭之前緩存內容,并且在接受到標記之前,不會顯示出整個表格。一些版本的MicrosoftInternetExplorer只有當接受到的256個字節以后才開始顯示該頁面,所以必須發送一些額外的空格來讓這些瀏覽器顯示頁面內容。
比如:
/**
Server:LightTPD/1.4.28(Win32)
X-Powered-By:PHP/5.3.27
*/
echo'佛法無邊'."
";
ob_flush();
flush();
sleep(1);
echo'法輪常轉';
//output
上面的代碼在chrome瀏覽器上面是一行一行的輸出,在ie系列的瀏覽器則是全部輸出。其實就是上面的第四條一些瀏覽器只有當接收256個字符才開始顯示。把上面的代碼改成下面形式:
/**
Server:LightTPD/1.4.28(Win32)
X-Powered-By:PHP/5.3.27
*/
echostr_pad('',240)."\n";
echo'佛法無邊'."
";
ob_flush();
flush();
sleep(1);
echo'法輪常轉';
//output
這樣在ie下面就會一行一行輸出,因為超過256個字符。
ob其他函數說明
1.ob_end_flush與ob_end_clean
end的顧名思義就結束,關閉緩沖區,都是關閉輸出緩沖,一個是輸出緩沖區,一個是清除。比如
/**
Server:LightTPD/1.4.28(Win32)
X-Powered-By:PHP/5.3.27
*/
echo'before';
ob_end_clean();
echostr_pad('',4096)."\n";
for($i=10;$i>0;$i--)
{
echo$i;
sleep(1);
}
上述代碼是一下輸出全部內容,而不是一個一個輸出。ob_end_clean()不是關閉了緩沖了?怎么不是一個一個輸出呢,其實我們上面也說了,php不是直接輸出給瀏覽器,而是webserver。雖然php沒有了緩沖。但是webserver還是有的。所以下面代碼:
/**
Server:LightTPD/1.4.28(Win32)
X-Powered-By:PHP/5.3.27
*/
echo'before';
ob_end_clean();
echostr_pad('',4096)."\n";
for($i=10;$i>0;$i--)
{
flush();
echo$i;
sleep(1);
}
加上flush(),就會一行一行輸出。假如把ob_end_clean換成ob_end_flush會把before輸出來。
其他函數可參考手冊,比較簡單。
總結
php腳本到瀏覽器,要經過phpbuffer=》webserverbuffer=》browserbuffer。最后顯示到瀏覽器。缺一不可。所以大家要ob_flush和flush以及加上echostr_pad(”,4096)才能調試出你想要的效果。
關于PHP中怎么實現輸出緩沖控制問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。