php怎麼清除緩衝區?

it生涯 發佈 2020-08-25T07:59:20+00:00

簡單而言,緩衝區的作用就是,把輸入或者輸出的內容先放進內存,而不顯示或者讀取.至於為什麼要有緩衝區,這是一個很廣泛的問題,如果有興趣,可以在網上找下資料.

php清除緩衝區的方法
方法1:ob_end_clean
ob_end_clean — 清空(擦除)緩衝區並關閉輸出緩衝
語法:
ob_end_clean ( void ) : bool
此函數丟棄最頂層輸出緩衝區的內容並關閉這個緩衝區。如果想要進一步處理緩衝區的內容,必須在ob_end_clean()之前調用ob_get_contents(),因為當調用ob_end_clean()時緩衝區內容將被丟棄。

返回值
成功時返回 TRUE, 或者在失敗時返回 FALSE。 錯誤的原因首先是,在調用時沒有一個起作用的緩衝區,或者是因為某些原因緩衝區不能被刪除(可能對特殊緩衝區而言)。
方法2:使用ob_clean()
ob_clean — 清空(擦掉)輸出緩衝區
說明
ob_clean ( void ) : void
此函數用來丟棄輸出緩衝區中的內容。
此函數不會像 ob_end_clean() 函數那樣銷毀輸出緩衝區。
輸出緩衝必須已被 ob_start() 以 PHP_OUTPUT_HANDLER_CLEANABLE 標記啟動。否則 ob_clean() 不會有效果。
返回值
沒有返回值。
擴展知識
什麼是緩衝區(buffer)?
簡單而言,緩衝區的作用就是,把輸入或者輸出的內容先放進內存,而不顯示或者讀取.至於為什麼要有緩衝區,這是一個很廣泛的問題,如果有興趣,可以在網上找下資料.
其實緩衝區最本質的作用就是,協調高速CPU和相對緩慢的IO設備(磁碟等)的運作.
PHP在執行的時候,在什麼地方有用到緩衝區?
想要了解PHP的緩衝區,就要知道執行PHP的時候,緩衝區被設置到了什麼地方.
當執行PHP的時候,如果碰到了echo print_r之類的會輸出數據的代碼,PHP就會將要輸出的數據放到PHP自身的緩衝區,等待輸出.
當PHP自身的緩衝區接到指令,指示要輸出緩衝區的內容時,將會把緩衝區內的數據輸出到apache上, apache接受到PHP輸出的數據,然後再把該數據存在到apache自身的緩衝區內,等到輸出
當apache接受到指令,只是要輸出緩衝區的內容時, 將會把緩衝區的內容輸出,返回到瀏覽器.
步驟:執行php---->(碰到echo,print_r之類輸出)將輸出的數據放到php自身的緩衝區,等待輸出---->(接收輸出緩衝區內容)數據輸出到apache上,存入apache自身的緩衝區---->(接收輸出指定)緩衝區內容輸出,返回到瀏覽器
echo、print => php output_buffering => webServer buffer => browser buff => browser display
即:腳本輸出 => php的緩衝區設置 => 系統的緩衝區設置(apache、nginx) => 瀏覽器的緩衝區設置 => 顯示給用戶
由此可見,PHP要輸出數據的時候,將會經過兩個緩衝區(先是自身的,然後是apache的),再返回到瀏覽器.
緩衝區在PHP中起到什麼作用?
1、最常見的就是在使用header函數之前,就已經輸出了某些數據,這樣會導致某些錯誤,例如 Cannot modify header information – headers already sent by;
echo "this is test";
header("LOCATION http://www.baidu.com");
出現這個錯誤的原因是, 在header之前已經輸出了某些數據,而輸出這些數據的同時, apache將會同時發送一個響應狀態到瀏覽器上(既然有輸出,即這個請求是有效的),而其後你又再次使用header函數
發送http頭,則會返回這個錯誤,錯誤的意思是:HTTP頭已經發送出去了,你不能對他再做修改.
為什麼使用緩衝區可以避免這個錯誤呢?
因為header函數是不受緩衝區影響的,當一碰到header函數的時候,PHP馬上執行apache發送這一個http頭都瀏覽器.
而輸出的數據PHP打開輸出緩衝區後, 這些數據將會存放在緩衝區,等待輸出.這樣就可以避免了之前所發生的錯誤.
2、通過PHP寫文件下載程序的時候.((實例篇)PHP實現HTTP斷點續傳的方法的原理)
為了讓文件下載更安全,同時提高更多的可控性,很多朋友都喜歡用PHP寫文件下載頁面.其原理很簡單,就是通過fwrite把文件內容讀出並顯示,然後通過header來發送HTTP頭,讓瀏覽器知道這是一個附件,這樣就可以達到提供下載的效果.
如果用上面的辦法提供下載頁面,會碰到一個效率問題,如果一個文件很大,假設為100M,那麼在不開啟緩衝區輸出的情況下,必須要把100M數據全部讀出,然後一次返回到頁面上,如果這樣做,用戶將會在所有數據讀完之後才會得到響應,降低了用戶體驗感.
如果開啟了輸出緩衝區,當PHP程序讀完文件的某一段,然後馬上輸出到apache,然後讓apache馬上返回到瀏覽器,這樣就可以減少用戶等待時間.那後面的數據怎麼辦呢?我們可以寫一個while循環,一直一段一段地讀取文件每讀一段,就馬上輸出,直到把文件全部輸出為止,這樣瀏覽器就可以持續地接受到數據,而不必等到所有文件讀取完畢. 另外,該做法還解決了另外一個很嚴重的問題.例如一個文件是100M,如果不開啟緩衝區的情況下,則需要把100M文件全部讀入內存,然後再輸出.但是,如果PHP程序做了內存限制呢?為了保證伺服器的穩定,管理員通常會把PHP的執行
內存設一個限制(通過php.ini總的memory_limit, 其默認值是8M), 也就是每個PHP程序使用的內存不能使用超過這個值的內存. 假設該值為8M,而要讀入的文件是100M,根本就沒有足夠的內存來讀入該文件.這個時候,我們就需要用到上面的
辦法來解決這個問題,每次只讀某一段,這樣就可以避免了內存的限制
3、靜態文件緩存
現在很多公司有這麼一個需求, 就是某一個頁面在第一次訪問的時候,會執行PHP,然後把顯示的內容返回到瀏覽器,同時需要把這次顯示的內容保存到伺服器上,這樣下次訪問的時候,就直接把保存在伺服器上的文件直接顯示,而不需要通過PHP來做操作這就是所謂的」靜態頁面緩存」.那怎麼樣才能做到把內容返回到瀏覽器的同時把數據保存到伺服器上呢?這就要用到輸出緩衝區了.
ob_start();
echo 'aaa';
$string = ob_get_contents();
file_put_contents('a.html', $string);
ob_flush();
flush();
與輸出緩衝區有關的配置
在PHP.INI中,有兩個跟緩衝區緊密相關的配置項
1.output_buffering
該配置直接影響的是php本身的緩衝區,有3種配置參數.on/off/xK(x為某個整型數值);
on - 開啟緩衝區
off - 關閉緩衝區
256k - 開啟緩衝區,而且當緩衝區的內容超過256k的時候,自動刷新緩衝區(把數據發送到apache);
2.implicit_flush
該配置直接影響apache的緩衝區,有2種配置參數. on/off
on - 自動刷新apache緩衝區,也就是,當php發送數據到apache的緩衝區的時候,不需要等待其他指令,直接就把輸出返回到瀏覽器
off - 不自動刷新apache緩衝區,接受到數據後,等待刷新指令
與緩衝區有關的函數
1.ob_implicit_flush
作用和implicit_flush一樣,是否自動刷新apache的緩衝區
2.flush
作用是發送指令到apache,讓apache刷新自身的輸出緩衝區.
3.ob_start
打開輸出緩衝區,無論php.ini的文件如何配置,如果使用該函數,即使output_buffering設置成off,也會打開輸出緩衝區
ob_start函數還接受一個參數,該參數是一個函數的回調,意思是,在輸入緩衝區內容之前,需要使用調用傳遞進來的參數把緩衝區的內容處理一次,再放入緩衝區內
4.ob_flush
指示php本身刷新自身的緩衝區,把數據發送到apache
5.ob_clean
清除php緩衝區裡面的內容
6.ob_end_clean
清除php緩衝區內的內容,並且關閉輸出緩衝區
7.ob_end_flush
把php自身的緩衝區里的內容發送到apache,並把清除自身緩衝區內的內容
8.ob_get_clean
獲取緩衝區的內容之後,清除緩衝區.
9.ob_get_contents
獲取輸出緩衝區里的內容
10.ob_get_flush
獲取緩衝區里的內容,並且把這些內容發送到apache
11.ob_get_length
獲取緩衝區里內容的長度
12.ob_list_handlers
獲取運行ob_start時,所回調的函數名稱, 例如:
ob_start(『ob_gzhandler』);
print_r(ob_list_handlers);
將列印出ob_gzhandler;
13.ob_gzhandler
該函數的作用是作為ob_start的回調參數, 在緩衝區刷新之前,會調用該函數對數據進行到底gzip或者deflate壓縮.這個函數需要zlib擴展的支持.

關鍵字: