首頁 > 後端開發 > php教程 > php邊執行邊輸出資料整理

php邊執行邊輸出資料整理

WBOY
發布: 2016-07-29 08:56:01
原創
1200 人瀏覽過
//ignore_user_abort(true);//是否忽略浏览器的断开而继续执行脚本
header( 'Content-Type: text/html;charset=utf-8' );
echo str_pad("",1000);   //输出1000个空格(浏览器需要接受一定长度的数据之后才会输出内容)
echo 'begin...<br>';
ob_flush();
flush();
for($i=0;$i<10;$i++)
{
    echo 'loading '.$i.'0%<br>';
	
    if ( connection_aborted() )//检查是否断开客户机。 如果已终止连接,则该函返回 1,否则返回 0
    {
        exit;
    }
	
	ob_flush();
    flush();
   
    sleep(1);//睡眠一秒
}
 
echo 'ok';
登入後複製
/*
首先明確一下PHP的輸出順序
1.開啟了php輸出快取: echo,print -> php output_buffring -> server buffering -> browser buffering -> browser display
2.未開啟php輸出快取,print -> server buffering -> browser buffering -> browser display
另外明確一下瀏覽器的輸出快取:IE為256Bytes, Chrome與FireFox為1000Bytes,只有輸出資料達到了這個長度或腳本結束瀏覽器才會將資料結束瀏覽器輸出在頁面上
再來說用到的幾個PHP設定和API:
1.php.ini中的output_buffering配置
?Off: 表示關閉PHP輸出快取
?On: 開啟無限大的輸出快取
?4096 : 開啟大小為4096Byte的輸出快取
2.php.ini中的implicit_flush配置
?On: 表示每次輸出(如echo,print)後自動呼叫flush()函數後,直接輸出
?Off: 與OnOn相反,每次輸出後不會調用flush(),需要等到server buffering滿了才會輸出,但是我們可以用flush()函數代替它,不開啟也沒關係,反而更加靈活
3.ob_flush()函數: 取出PHP buffering中的資料,放入server buffering
4.flush()函數: 取出Server buffering的資料,放入browser buffering
5.ob_start()函式:在伺服器開啟一個緩衝區來保存所有的輸出。所以在任何時候使用echo ,輸出都會加入緩衝區中,直到程式運行結束或使用ob_flush()來結束。然後在伺服器中緩衝區的內容才會傳送到瀏覽器,由瀏覽器來解析顯示
ob_*系列函數, 是操作PHP本身的輸出緩衝區.
ob_g​​et_contents() - 傳回輸出緩衝區的內容
ob_flush( ) - 沖刷出(送出)輸出緩衝區中的內容
ob_clean() - 清空(擦掉)輸出緩衝區
ob_end_flush() - 沖刷出(送出)輸出緩衝區內容並關閉緩衝
ob_end_clean() - 清除(擦除)緩衝區並關閉輸出緩衝
flush() - 刷新輸出緩衝
總結:
ob_flush是刷新PHP自身的緩衝區.
函數ob_end_clean 會清除緩衝區的內容,並將緩衝區關閉,但不會輸出內容。
此時得用一個函數ob_get_contents()在ob_end_clean()前面來獲得緩衝區的內容。
這樣的話, 能將在執行ob_end_clean()前把內容保存到一個變數中,然後在ob_end_clean()後面對這個變數做操作
可以被用作緩存靜態html內容
注意:flush, 嚴格來講,這個只有在PHP做為apache的Module(handler或filter)安裝的時候, 才有實際作用. 它是刷新WebServer(可以認為特指apache)的緩衝區.
1.在apache module的sapi下, flush會透過呼叫sapi_module的flush成員函數指標, 間接的呼叫apache的api: ap_rflush刷新apache的輸出緩衝區,
當然手冊中也說了, 有一些apache的其他模組, 可能會改變這個動作的結果..
2 .有些Apache的模組,例如mod_gzip,可能會自己進行輸出緩存,這將導致flush()函數產生的結果不會立即被傳送到客戶端瀏覽器。
甚至瀏覽器也會在顯示之前,快取接收到的內容。例如 Netscape瀏覽器會在接受到換行或 html 標籤的開頭之前快取內容,並且在接受到 標記之前,不會顯示整個表格。
3.某些版本的 Microsoft Internet Explorer 只有在接受到的256個位元組以後才開始顯示該頁面,所以必須傳送一些額外的空格來讓這些瀏覽器顯示頁面內容。
所以, 正確使用倆者的順序是. 先ob_flush, 然後flush。
當然, 在其他sapi下, 不調用flush也可以, 只不過為了保證你代碼的可移植性, 建議配套使用.

*/

http://

bbs.csdn.net/topics/310167610

http://my.oschina.net/miaowang/blog/349290

( 09/12/2682136.html


感謝大家的無私分享!

以上就介紹了php邊執行邊輸出資料整理,包含了方面的內容,希望對PHP教學有興趣的朋友有幫助。

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板