首頁  >  文章  >  後端開發  >  php怎麼清除緩衝區?

php怎麼清除緩衝區?

青灯夜游
青灯夜游原創
2020-08-25 11:54:065019瀏覽

php清除緩衝區的方法:1、使用「ob_clean()」函數清除,函數可以清除php緩衝區裡面的內容;2、使用「ob_end_clean()」函數清除,函數清除php緩衝區內的內容,並且關閉輸出緩衝區。

php怎麼清除緩衝區?

推薦:《PHP影片教學

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扩展的支持.

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

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