首頁  >  文章  >  後端開發  >  php怎麼關閉緩衝區

php怎麼關閉緩衝區

青灯夜游
青灯夜游原創
2021-09-28 19:08:142533瀏覽

php關閉緩衝區的方法:1、開啟PHP安裝目錄,找到並開啟設定檔「php.ini」;2、在設定檔中,找到「output_buffering」項,將該項的值設定為“Off”即可。

php怎麼關閉緩衝區

本教學操作環境:windows7系統、PHP7.1版,DELL G3電腦

PHP 緩衝區( buffer)

腳本輸出資訊先放入buffer,只有當buffer滿了或腳本運行完畢,資料才會往下一階段轉移。在設定檔php.ini可以找到output_buffering設定項,我的預設設定(Windows/XAMPP v3.2.2)是4096

php怎麼關閉緩衝區

若設定成On,緩衝區可用且無大小限制;

若設定為Off,緩衝區不可用;

若設定為整數,緩衝區可用且設定大小,單位位元組

需要注意的是,ini_set無法設定buffer大小,在初始化腳本執行環境時,已經做好了buffer的定義;cli模式下總是預設output_buffering為Off 。

那麼問題來了,緩衝區關閉和開啟有什麼區別?緩衝區初始設定的大小有什麼作用? cli模式預設關閉若業務需要能開啟嗎?快取區存在有什麼好處?

1.      緩衝區關閉與開啟有何不同?

透過程式碼檢定

output_buffering配置為4096時,執行程式碼

輸出結果:等待3秒鐘後,同時輸出了start和end

Output_buffering配置為Off時,執行相同程式碼

輸出結果:先輸出了start,等待3秒鐘後,輸出了end

#單一看結果一模一樣啊~但是觀察其運行過程發現了很驚訝的不同點。若緩衝關閉,先輸出“start”,等待3秒後再輸出“end”。而緩衝開啟,會等待腳本執行完成,一併輸出結果

這個例子中,flush用來刷新apache的緩衝區,類似讓PHP buffer與瀏覽器建立直接聯繫,好讓我們的注意力能夠專注PHP buffer本身。

透過一個形象的例子比喻,PHP的緩衝區像一個大房子,每次echo等輸出函數執行時,將資料丟到這個大房子裡,直到腳本執行完成或執行ob_flush函數,將資料從大房子中釋放,丟給了WebServer緩衝區。關閉了PHP緩衝區後,echo函數執行,沒有大房子可以放怎麼辦呢,就只好直接交給WebServer緩衝區了。

透過例子和程式碼執行結果,我們能夠明白,所謂PHP buffer,是PHP本身開啟的資料儲存中樞站,一系列的ob函數都是為此操作。 (舉幾個例子函數)

ob_clean();            //刪除內部緩衝區的內容,且未關閉緩衝區(不輸出)。

ob_end_clean();        //刪除內部緩衝區的內容,並關閉緩衝區(不輸出)。

ob_get_contents();     //傳回緩衝區的內容,不輸出

ob_get_length();       //傳回內部緩衝區的長度,若緩衝區未啟動,則此函數回傳FALSE 。

2.      緩衝區初始設定的大小有何作用?

將output_buffering從4096改為5,方便執行測試

#執行程式碼

##輸出說明:等待3秒後,輸出1234end

執行程式碼

#輸出說明:輸出12345,等待3秒後,輸出end

透過輸出的比較,很能說明差別了。

緩衝區只能放5位元組的數據,放進來的小於這個最大值,還能先存存放放,要是大於等於臨界值,那就只好將數據踢出去了,這就跟我們手動執行了ob_flush函數一個效果。

3.      cli模式預設關閉若業務需要能開啟嗎?

這個問題可以做個補充,非cli模式下,如果php.ini設定緩衝區關閉,但是業務需要用到buffer,咋整呢,難不成還要去改配置。當然不會那麼難搞了,這時候又一個ob函數來了,

ob_start();            //開啟一個輸出緩衝區,所有的輸出資訊不再直接傳送到瀏覽器,而是儲存在輸出緩衝區裡面。

知道了PHP buffer類似資料暫存區的概念,回過頭再來看看TP5源碼。

先來看看ob_get_level和ob_get_clean函數解釋

ob_get_level() :傳回輸出緩衝機制的巢狀層級。

ob_get_clean():#​​##得到目前緩衝區的內容並刪除目前輸出緩衝區。

從程式碼中也能得知一二,若level取得大於0,取得緩衝區的內容並刪除緩衝區,再透過ob_start開啟一個新的,這也很符合註解裡說明的「重新申請」。

這裡解釋下所謂的嵌套,至於level的值啥時候會為0,並且非0的話是什麼呢,請將php.ini output_buffering關閉,輸出看看結果。另外多次ob_start,多次ob_get_level,來試試比較輸出結果吧。

先來看看兩個模型


#在多次ob_start開啟新的緩衝區時,資料結構的構造為第二種,這就是嵌套了。 ob_get_level回傳了嵌套的層級。

個人理解,嵌套可以套用Java的流機制來類比,一個緩衝區的資料輸出到下一個緩衝區,然後可以對資料做客製化的操作。

現在看TP5源碼,想法就比較清晰了。如果系統初始化了緩衝區,因為大小可能會有限制,所以先刪除再重新開啟。而執行ob_start打開的快取區,它的大小“足夠大”,但是到底有多大,暫時沒有查到具體的說明,只知道,不管寫入資料多大,都會直到腳本結束才會發送

4.      快取區存在有何好處?

PHP輸出資料傳送到WebServer,若echo執行一次發送一次,這加大了資源消耗,不如儲存在記憶體中,統一傳送更有效率。

Web請求包含HTTP頭部,頭部在設定之前不能有任何的輸出。 PHP緩衝區替我們做好了這步驟工作,在頭部發送前輸出各種數據,緩衝區會先將頭部資訊傳送到WebSever,再統一發送數據封包。

推薦學習:《

PHP影片教學

以上是php怎麼關閉緩衝區的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn