自由控制指令碼中資料的輸出。它非常地有用,特別是對於:當你想
在資料已經輸出後,再輸出檔案頭的情況。輸出控制函式不對使用
header()
或setcookie(),
傳送的檔案頭資訊產生影響
,只對那些類似於
echo()
和php
**的資料塊有作用。(這段話引用於
首先介紹兩個php.ini配置檔案中的配置項:output_buffering
和implicit_flush。
output_buffering
:on/off
或者整數
。設定為
on時,將在所有指令碼中使用輸出快取控制,不限制快取的大小。而設定為整數時,如
output_buffering=4096
,當快取資料達到
4096
位元組時會自動輸出重新整理快取。而這個引數的不同正是導致以上**在不同時候執行結果不同的原因。
當output_buffering
關閉時,指令碼所有的輸出(
echo
)都會即時傳送到客戶端,執行上面**時就是每秒輸出乙個數字。而開啟
output_buffering
後,輸出內容就會先快取在服務端,直到指令碼結束時才一起傳送給客戶端。
implicit_flush:on/off。設定on意味著,當指令碼有輸出時,自動立即傳送到客戶端。相當於在echo後自動加flush()。
下面再介紹下php的快取機制:
指令碼開始執行時,它可以同時傳送header(標題)資訊和主體資訊。header資訊(來自 header() 或 setcookie()函式)並不會立即傳送,相反,它被儲存到乙個列表中。這樣就可以允許你修改標題資訊,包括預設的標題(例如 content-type標題)。
但是,一旦指令碼傳送了任何非標題的輸出(例如,使用html
**塊或 print()呼叫),那麼php就必須先傳送所有的標題,然後再送出空行,終止 httpheader,而在此之後才會繼續傳送主體資料。從這時開始,任何新增或修改標題資訊的試圖都是不允許的,並會傳送上述的錯誤訊息之一。
雖然這並不會引起多大的問題,有時候只是在發出任何輸入之前終止httpheader,從而引起指令碼邏輯的複雜化而已。output buffering技術可以解決這些問題。
output buffering的工作原理:
啟用output buffering時,在指令碼傳送輸出時,php
並 不傳送httpheader。相反,它將此輸出通過管道(pipe)輸入到動態增加的快取中(只能在php4.0中使用,它具有**化的輸出機制)。你仍然可以修改,新增標題行,或者設定cookie,因為標題實際上並沒有傳送。最簡單的情況是,當指令碼終止時,php將自動傳送http header到瀏覽器,然後再傳送輸出緩衝中的內容
phpob_start():開啟緩衝區
說明:相當於將引數
output_buffering
設定為on
;也就是說,如果引數
output_buffering
的值為on
,那麼呼叫
ob_start()
與不呼叫的效果是一樣的。
ob_end_flush()傳送outputbuffer(輸出緩衝)並禁用output buffering機制。
ob_end_clean()清除outputbuffer但不傳送,並禁用output buffering。
ob_get_contents()將當前的outputbuffer返回成乙個字串。允許你處理指令碼發出的任何輸出。
關於flush
與ob_flush
這篇文章是我看了很多篇關於這兩個函式區別的文章中最淺顯易懂的。力薦。
擴充套件KMP詳解
以下摘自 求出a i.lena 1 與b的最長公共字首長度,記為ex i 或者說,ex i 為滿足a i.i z 1 b 0.z 1 的最大的z值 擴充套件kmp可以用來解決很多字串問題,如求乙個字串的最長回文子串和最長重複子串。演算法 設next i 為滿足b i.i z 1 b 0.z 1 的最...
擴充套件KMP詳解
最近新學的三個演算法,一直都沒寫部落格,字尾自動機和線性基還有一點小尾巴,爭取這兩天結束 求 t 串與 s 串的每個字尾的最長公共字首 假設當前遍歷到s串位置i,即nxts 0 nxts i 1 這i個位置的值已經計算得到。設定兩個變數,st和pos。pos代表以st為起始位置的字元匹配成功的最右邊...
XMPP擴充套件協議詳解
基本的jabber客戶端必須實現以下標準協議 xep 0211 1 rfc3920 core 2 rfc3921 instant messaging and presence 3 xep 030 service discovery 4 xep 0115 entity capabilities 基本的...