php緩衝機制及巢狀級別 ob get level

2021-10-06 14:14:35 字數 2811 閱讀 5766

在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 函式,資料便會 嗖 的一聲飛到瀏覽器上,顯示出來。我也一直如此單純地認為。其實,在技術的世界裡,向來都是由簡單到複雜,也許那些技術開發者開始單純如你我,但是面對殘酷的現實,不得不調整策略,以...