首頁  >  文章  >  後端開發  >  flushes PHP逐行輸出(ob_flush與flush的組合)

flushes PHP逐行輸出(ob_flush與flush的組合)

WBOY
WBOY原創
2016-07-29 08:47:55979瀏覽

ob_flush/flush在手冊中的描述, 都是刷新輸出緩衝區, 並且還需要配套使用, 所以會導致很多人迷惑…
其實, 他們倆的操作對像不同, 有些情況下, flush根本不做什麼事情. .
ob_*系列函數, 是操作PHP本身的輸出緩衝區.
所以, ob_flush是刷新PHP自身的緩衝區.
而flush, 嚴格來講, 這個只有在PHP做為apache的Module(handler或者filter)安裝的時候, 才有實際作用. 它是刷新WebServer(可以認為特指apache)的緩衝區.
在apache module的sapi下, flush會透過調用sapi_module的flush成員函數指標, 間接的調用apache的api: ap_rflush刷新apache的輸出緩衝區, 當然手冊中也說了, 有一些apache的其他模組, 可能會改變這個動作的結果..
有些Apache的模組,比如mod_gzip,可能自己進行輸出緩存,這將導致flush ()函數產生的結果不會立即被傳送到客戶端瀏覽器。
甚至瀏覽器也會在顯示之前,快取接收到的內容。例如 Netscape瀏覽器會在接受到換行或 html 標籤的開頭之前快取內容,並且在接受到 標記之前,不會顯示整個表格。
一些版本的 Microsoft Internet Explorer 只有在接受到的256個位元組以後才開始顯示該頁面,所以必須傳送一些額外的空格來讓這些瀏覽器顯示頁面內容。
所以, 正確使用倆者的順序是. 先ob_flush, 然後flush,
當然, 在其他sapi下, 不調用flush也可以, 只不過為了保證你代碼的可移植性, 建議配套使用.
在IE 中,必須先輸出256個位元組,才會起作用,如下程式碼:

複製程式碼 程式碼如下:


function execte(){
echo str_pad("", 256); =1;$iecho $i."
";
ob_flush();
flush();
sleep(1);
}
}

sleep(1);

}

}

sleep(1);

} 🎜} 🎜🎜sleep(1); 🎜} 🎜} 🎜🎜sleep(1); 🎜} 🎜} 🎜🎜sleep(1); 🎜} 🎜} 🎜🎜sleep(1); 🎜) 🎜 以上就介紹了flushes PHP逐行輸出(ob_flush與flush的組合),包括了flushes方面的內容,希望對PHP教程有興趣的朋友有所幫助。 🎜 🎜 🎜
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn