PHP buffer的机制
PHP的buffer是這樣的:
輸出的字符串 => PHP buffer => 等待輸出 => web 服務(wù)器的緩沖區(qū) => tcp 緩沖區(qū) => 客戶端。過程其實相當(dāng)?shù)膹?fù)雜。
大概的工作機制:
bool?ob_start??? ([?callback?$output_callback?? [,?int?$chunk_size?? [,?bool?$erase? ]]] ) 這個函數(shù)我關(guān)鍵要強調(diào)一下第二個參數(shù):
如果可選參數(shù)?chunk_size?被賦值了,在任何一個能引起緩沖區(qū)的長度等于或超過?chunk_size?的輸出操作后,緩沖區(qū)都會被刷送。 ?默認(rèn)值 0 意味著腳本結(jié)束之后,緩沖區(qū)會被刷送,其余的特殊值可以將?chunk_size從 1 設(shè)定到 4096。??
這個參數(shù)默認(rèn)是0.
還有一點,緩沖區(qū)是可以嵌套的。這點非常關(guān)鍵。比如你調(diào)用了兩次ob_start ,就會創(chuàng)建用兩個緩沖區(qū)。第二次創(chuàng)建的緩沖區(qū),會寫入第一次創(chuàng)建的緩沖區(qū),而ob_start 創(chuàng)建的緩沖區(qū),總是會寫入output_buffering =ON 時候系統(tǒng)自動創(chuàng)建的緩沖區(qū)。
我們再來看一下:ob_end_flush ,這個函數(shù)的作用是把最后一次打開的緩沖區(qū)關(guān)閉掉,并把內(nèi)容送入下一個緩沖區(qū)。如果下一個緩沖區(qū)沒有,就進(jìn)入等待輸出的狀態(tài)了。
flush是刷新等待輸出的內(nèi)容去瀏覽器。前提是內(nèi)容是等待輸出的狀態(tài)了,而不是在緩沖區(qū)中,它不會影響緩沖區(qū)的內(nèi)容。
再來看你的代碼:
如果output_buffering = On ,那么系統(tǒng)會默認(rèn)創(chuàng)建一個緩沖區(qū),這個大小一般是2K.?ob_end_flush的內(nèi)容會進(jìn)入這個緩沖區(qū),而不會進(jìn)入輸出等待。所以調(diào)用flush一點效果都沒有。直到腳本結(jié)束,PHP送出所有的內(nèi)容。
如果output_buffering = Off?ob_end_flush的內(nèi)容會進(jìn)入輸出等待狀態(tài),這個時候flush一下,內(nèi)容就能輸出了。
當(dāng)然,這個只是PHP這一端的情況分析。
還會有其他的因數(shù)影響最終的輸出:
?個別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)容。
轉(zhuǎn)載于:https://www.cnblogs.com/yulei126/p/6786073.html
總結(jié)
以上是生活随笔為你收集整理的PHP buffer的机制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图片处理拓展篇 : 图片转字符画(asc
- 下一篇: 动态规划算法php,php算法学习之动态