在php的配置檔案php.ini中有以下這項配置output_buffering
,php.ini預設設定了output_buffering = 4096,php已經設定了乙個緩衝區。
如果php.ini 中開啟了此項: echo,print 後的輸出順序就是-> php output_buffring -> server buffering -> browser buffering -> browser display;
如果未開啟php輸出快取: echo,print 後的輸出順序就是-> server buffering -> browser buffering -> browser display.
如果 php.ini 開啟了快取,則 ob_get_level() 得到的值會是1,相當於都執行了一次ob_start(),配置output_buffering = 0,巢狀級別的值會為0。如果總是希望在指令碼的開頭有乙個輸出緩衝區,則可以使用
if (!ob_get_level()) ob_start();
在指令碼的開頭這樣寫,相當於可以關閉 php.ini 中設定的快取區輸出緩衝區處理函式的作用有點類似堆疊,臨時放入乙個儲存空間中,對內容進行處理。類似佇列一樣,但是不是先進先出,而是先開後關,快取區關閉的順序是從下到上。
ob_start() 每執行一次,就會開啟乙個新的快取區。
先看個例子:
// php.ini中開啟了快取區,相當於都已執行一次 ob_start() (理解名為 buffer_a 區塊)
echo '(buffer_a)'; //快取 buffer_a 區 儲存了下面的所有輸出
echo ob_get_level(); #輸出1
ob_start(); #開啟乙個快取區(理解名為 buffer_b 區塊)
echo '(buffer_b)'; //快取 buffer_b 區 儲存了下面的所有輸出(不包括a區的內容)
echo ob_get_level(); #輸出2
ob_start(); #開啟乙個快取區(理解名為 buffer_c 區塊)
echo '(buffer_c)'; //快取 buffer_c 區 儲存了下面的所有輸出(不包括 a&b 區的內容)
echo ob_get_level(); #輸出3
echo "
---------------------
";//第1次獲取輸出快取區的內容是最後乙個緩衝區的內容:輸出 buffer_c 區範圍下的內容
//echo ob_get_contents(); # 輸出 3(buffer_c)
//第1次關閉的緩衝區是最後乙個快取區:buffer_c
ob_end_flush(); #關閉快取區(buffer_c )
//關閉1個快取區後,第二次獲取快取區的內容:輸出的是 buffer_b 區 範圍下的內容,
//echo ob_get_contents(); # 輸出 2(buffer_b)3(buffer_c)
//第2次關閉的緩衝區:buffer_b
ob_end_flush();
//關閉2個快取區後,第三次獲取快取區的內容:輸出的是 buffer_a 區 範圍下的內容,
//echo ob_get_contents(); # 輸出 (buffer_a)1(buffer_b)2(buffer_c)3
//第3次關閉的緩衝區:buffer_a,此時所有的緩衝區都被清了
ob_end_flush();
echo ob_get_contents(); # 沒有內容輸出
通過ob_get_contents()
每次獲取到的快取區的內容可得到,每個緩衝區儲存的內容都是在他下面範圍的內容。
這個「下面」怎麼理解,如例中:buffer_a
區儲存a,b,c 這3區的內容,buffer_b
區儲存的是b,c 這2區的內容,buffer_c
區儲存的是 c 這1區的內容。
而ob_end_flush()
每次關閉都是後面的緩衝區,關閉的順序是從下到上的關閉,也是先開後關,後開先關
,就如排隊一樣,start 開啟時是按照順序開啟,關閉時是從隊伍後面開始關閉。
如例子,最先關閉的是 c區,然後 b 區,最後 a 區 。(start開啟緩衝區是進隊:a,b,c ,end關閉快取區是出隊: c,b,a)
理解好每個快取區儲存的是「所屬下面的內容」,第一次開啟的快取區是最頂級的,下面所有子級的內容都在上游的快取區中。
1、所有緩衝區控制是在乙個php執行程序中發生的。如:你開啟n個demo.php,他們之間開啟和關閉緩衝是互不影響的。
2、output_buffering在程式中用ini_set是不能生效的。
3、所有緩衝區資料,如果沒有手工flush刷出,則在程式結束會被直譯器刷出。
4、關於巢狀級別:當順序開啟多個ob_start()時,會相應開啟多個緩衝區。可以理解成佇列,隊伍成員是ob_start()開啟的緩衝區塊,而ob_get_level()可理解成當前隊伍最末尾的緩衝塊的序列號。
5、每次echo,print輸出的內容都是針對隊尾的緩衝區塊進行的。
6、每次ob[end][flush|clean]函式也都是針對隊尾緩衝區塊進行的。
7、每次執行flush刷出,都是由位於隊尾緩衝區塊向上一級緩衝區塊刷出,且區塊裡的內容不是替換,而是疊加。
php輸出緩衝機制
php輸出快取模式 快取 指令碼輸出echo print r php buffer tcp buffer 瀏覽器 buffer 瀏覽器顯示 1 瀏覽器 buffer echo str repeat 200 hello sjolzy.cn 這裡是否是瀏覽器快取的影響還是輸出足夠大爆到最大快取了,還需要...
mysql事務隔離級別及傳播機制
transaction 事務隔離級別 在說明事務隔離級別之前先說一下髒讀 不可重複讀 幻讀這三個概念。髒讀 乙個事務讀取到另一事務未提交的更新新據。當乙個事務正在訪問資料,並且對資料進行了修改,而這種修改還沒有 提交到資料庫中,這時,另外乙個事務也訪問這個資料,然後使用了這個資料。因為這個資料是還沒...
php中ob函式緩衝機制深入理解
對於乙個剛剛入門的php程式設計師來說,php緩衝區是幾乎透明的。在他們心目中,乙個echo print r 函式,資料便會 嗖 的一聲飛到瀏覽器上,顯示出來。我也一直如此單純地認為。其實,在技術的世界裡,向來都是由簡單到複雜,也許那些技術開發者開始單純如你我,但是面對殘酷的現實,不得不調整策略,以...