PHP buffer的机制
PHP的buffer是這樣的:
輸出的字符串 => PHP buffer => 等待輸出 => web 服務器的緩沖區 => tcp 緩沖區 => 客戶端。過程其實相當的復雜。
大概的工作機制:
bool?ob_start??? ([?callback?$output_callback?? [,?int?$chunk_size?? [,?bool?$erase? ]]] ) 這個函數我關鍵要強調一下第二個參數:
如果可選參數?chunk_size?被賦值了,在任何一個能引起緩沖區的長度等于或超過?chunk_size?的輸出操作后,緩沖區都會被刷送。 ?默認值 0 意味著腳本結束之后,緩沖區會被刷送,其余的特殊值可以將?chunk_size從 1 設定到 4096。??
這個參數默認是0.
還有一點,緩沖區是可以嵌套的。這點非常關鍵。比如你調用了兩次ob_start ,就會創建用兩個緩沖區。第二次創建的緩沖區,會寫入第一次創建的緩沖區,而ob_start 創建的緩沖區,總是會寫入output_buffering =ON 時候系統自動創建的緩沖區。
我們再來看一下:ob_end_flush ,這個函數的作用是把最后一次打開的緩沖區關閉掉,并把內容送入下一個緩沖區。如果下一個緩沖區沒有,就進入等待輸出的狀態了。
flush是刷新等待輸出的內容去瀏覽器。前提是內容是等待輸出的狀態了,而不是在緩沖區中,它不會影響緩沖區的內容。
再來看你的代碼:
如果output_buffering = On ,那么系統會默認創建一個緩沖區,這個大小一般是2K.?ob_end_flush的內容會進入這個緩沖區,而不會進入輸出等待。所以調用flush一點效果都沒有。直到腳本結束,PHP送出所有的內容。
如果output_buffering = Off?ob_end_flush的內容會進入輸出等待狀態,這個時候flush一下,內容就能輸出了。
當然,這個只是PHP這一端的情況分析。
還會有其他的因數影響最終的輸出:
?個別web服務器程序,特別是Win32下的web服務器程序,在發送結果到瀏覽器之前,仍然會緩存腳本的輸出,直到程序結束為止。???
?有些Apache的模塊,比如mod_gzip,可能自己進行輸出緩存,這將導致flush()函數產生的結果不會立即被發送到客戶端瀏覽器。???
?甚至瀏覽器也會在顯示之前,緩存接收到的內容。例如 Netscape 瀏覽器會在接受到換行或 html 標記的開頭之前緩存內容,并且在接受到 </table> 標記之前,不會顯示出整個表格。???
???? 一些版本的 Microsoft Internet Explorer 只有當接受到的256個字節以后才開始顯示該頁面,所以必須發送一些額外的空格來讓這些瀏覽器顯示頁面內容。
轉載于:https://www.cnblogs.com/yulei126/p/6786073.html
總結
以上是生活随笔為你收集整理的PHP buffer的机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图片处理拓展篇 : 图片转字符画(asc
- 下一篇: CoreAnimation (CALay