php清除緩沖區(qū)的方法:1、使用“ob_clean()”函數(shù)清除,該函數(shù)可以清除php緩沖區(qū)里面的內(nèi)容;2、使用“ob_end_clean()”函數(shù)清除,該函數(shù)清除php緩沖區(qū)內(nèi)的內(nèi)容,并且關(guān)閉輸出緩沖區(qū)。
10年的和平網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。成都全網(wǎng)營(yíng)銷推廣的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整和平建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)從事“和平網(wǎng)站設(shè)計(jì)”,“和平網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
推薦:《PHP視頻教程》
php清除緩沖區(qū)的方法
方法1:ob_end_clean
ob_end_clean — 清空(擦除)緩沖區(qū)并關(guān)閉輸出緩沖
語(yǔ)法:
ob_end_clean ( void ) : bool
此函數(shù)丟棄最頂層輸出緩沖區(qū)的內(nèi)容并關(guān)閉這個(gè)緩沖區(qū)。如果想要進(jìn)一步處理緩沖區(qū)的內(nèi)容,必須在ob_end_clean()之前調(diào)用ob_get_contents(),因?yàn)楫?dāng)調(diào)用ob_end_clean()時(shí)緩沖區(qū)內(nèi)容將被丟棄。
返回值
成功時(shí)返回 TRUE, 或者在失敗時(shí)返回 FALSE。 錯(cuò)誤的原因首先是,在調(diào)用時(shí)沒有一個(gè)起作用的緩沖區(qū),或者是因?yàn)槟承┰蚓彌_區(qū)不能被刪除(可能對(duì)特殊緩沖區(qū)而言)。
方法2:使用ob_clean()
ob_clean — 清空(擦掉)輸出緩沖區(qū)
說明
ob_clean ( void ) : void
此函數(shù)用來丟棄輸出緩沖區(qū)中的內(nèi)容。
此函數(shù)不會(huì)像 ob_end_clean() 函數(shù)那樣銷毀輸出緩沖區(qū)。
輸出緩沖必須已被 ob_start() 以 PHP_OUTPUT_HANDLER_CLEANABLE 標(biāo)記啟動(dòng)。否則 ob_clean() 不會(huì)有效果。
返回值
沒有返回值。
擴(kuò)展知識(shí)
什么是緩沖區(qū)(buffer)?
簡(jiǎn)單而言,緩沖區(qū)的作用就是,把輸入或者輸出的內(nèi)容先放進(jìn)內(nèi)存,而不顯示或者讀取.至于為什么要有緩沖區(qū),這是一個(gè)很廣泛的問題,如果有興趣,可以在網(wǎng)上找下資料.
其實(shí)緩沖區(qū)最本質(zhì)的作用就是,協(xié)調(diào)高速CPU和相對(duì)緩慢的IO設(shè)備(磁盤等)的運(yùn)作.
PHP在執(zhí)行的時(shí)候,在什么地方有用到緩沖區(qū)?
想要了解PHP的緩沖區(qū),就要知道執(zhí)行PHP的時(shí)候,緩沖區(qū)被設(shè)置到了什么地方.
當(dāng)執(zhí)行PHP的時(shí)候,如果碰到了echo print_r之類的會(huì)輸出數(shù)據(jù)的代碼,PHP就會(huì)將要輸出的數(shù)據(jù)放到PHP自身的緩沖區(qū),等待輸出.
當(dāng)PHP自身的緩沖區(qū)接到指令,指示要輸出緩沖區(qū)的內(nèi)容時(shí),將會(huì)把緩沖區(qū)內(nèi)的數(shù)據(jù)輸出到apache上, apache接受到PHP輸出的數(shù)據(jù),然后再把該數(shù)據(jù)存在到apache自身的緩沖區(qū)內(nèi),等到輸出
當(dāng)apache接受到指令,只是要輸出緩沖區(qū)的內(nèi)容時(shí), 將會(huì)把緩沖區(qū)的內(nèi)容輸出,返回到瀏覽器.
步驟:執(zhí)行php---->(碰到echo,print_r之類輸出)將輸出的數(shù)據(jù)放到php自身的緩沖區(qū),等待輸出---->(接收輸出緩沖區(qū)內(nèi)容)數(shù)據(jù)輸出到apache上,存入apache自身的緩沖區(qū)---->(接收輸出指定)緩沖區(qū)內(nèi)容輸出,返回到瀏覽器
echo、print => php output_buffering => webServer buffer => browser buff => browser display
即:腳本輸出 => php的緩沖區(qū)設(shè)置 => 系統(tǒng)的緩沖區(qū)設(shè)置(apache、nginx) => 瀏覽器的緩沖區(qū)設(shè)置 => 顯示給用戶
由此可見,PHP要輸出數(shù)據(jù)的時(shí)候,將會(huì)經(jīng)過兩個(gè)緩沖區(qū)(先是自身的,然后是apache的),再返回到瀏覽器.
緩沖區(qū)在PHP中起到什么作用?
1、最常見的就是在使用header函數(shù)之前,就已經(jīng)輸出了某些數(shù)據(jù),這樣會(huì)導(dǎo)致某些錯(cuò)誤,例如 Cannot modify header information – headers already sent by;
echo "this is test"; header("LOCATION http://www.baidu.com");
出現(xiàn)這個(gè)錯(cuò)誤的原因是, 在header之前已經(jīng)輸出了某些數(shù)據(jù),而輸出這些數(shù)據(jù)的同時(shí), apache將會(huì)同時(shí)發(fā)送一個(gè)響應(yīng)狀態(tài)到瀏覽器上(既然有輸出,即這個(gè)請(qǐng)求是有效的),而其后你又再次使用header函數(shù)
發(fā)送http頭,則會(huì)返回這個(gè)錯(cuò)誤,錯(cuò)誤的意思是:HTTP頭已經(jīng)發(fā)送出去了,你不能對(duì)他再做修改.
為什么使用緩沖區(qū)可以避免這個(gè)錯(cuò)誤呢?
因?yàn)閔eader函數(shù)是不受緩沖區(qū)影響的,當(dāng)一碰到header函數(shù)的時(shí)候,PHP馬上執(zhí)行apache發(fā)送這一個(gè)http頭都瀏覽器.
而輸出的數(shù)據(jù)PHP打開輸出緩沖區(qū)后, 這些數(shù)據(jù)將會(huì)存放在緩沖區(qū),等待輸出.這樣就可以避免了之前所發(fā)生的錯(cuò)誤.
2、通過PHP寫文件下載程序的時(shí)候.((實(shí)例篇)PHP實(shí)現(xiàn)HTTP斷點(diǎn)續(xù)傳的方法的原理)
為了讓文件下載更安全,同時(shí)提高更多的可控性,很多朋友都喜歡用PHP寫文件下載頁(yè)面.其原理很簡(jiǎn)單,就是通過fwrite把文件內(nèi)容讀出并顯示,然后通過header來發(fā)送HTTP頭,讓瀏覽器知道這是一個(gè)附件,這樣就可以達(dá)到提供下載的效果.
如果用上面的辦法提供下載頁(yè)面,會(huì)碰到一個(gè)效率問題,如果一個(gè)文件很大,假設(shè)為100M,那么在不開啟緩沖區(qū)輸出的情況下,必須要把100M數(shù)據(jù)全部讀出,然后一次返回到頁(yè)面上,如果這樣做,用戶將會(huì)在所有數(shù)據(jù)讀完之后才會(huì)得到響應(yīng),降低了用戶體驗(yàn)感.
如果開啟了輸出緩沖區(qū),當(dāng)PHP程序讀完文件的某一段,然后馬上輸出到apache,然后讓apache馬上返回到瀏覽器,這樣就可以減少用戶等待時(shí)間.那后面的數(shù)據(jù)怎么辦呢?我們可以寫一個(gè)while循環(huán),一直一段一段地讀取文件每讀一段,就馬上輸出,直到把文件全部輸出為止,這樣瀏覽器就可以持續(xù)地接受到數(shù)據(jù),而不必等到所有文件讀取完畢. 另外,該做法還解決了另外一個(gè)很嚴(yán)重的問題.例如一個(gè)文件是100M,如果不開啟緩沖區(qū)的情況下,則需要把100M文件全部讀入內(nèi)存,然后再輸出.但是,如果PHP程序做了內(nèi)存限制呢?為了保證服務(wù)器的穩(wěn)定,管理員通常會(huì)把PHP的執(zhí)行
內(nèi)存設(shè)一個(gè)限制(通過php.ini總的memory_limit, 其默認(rèn)值是8M), 也就是每個(gè)PHP程序使用的內(nèi)存不能使用超過這個(gè)值的內(nèi)存. 假設(shè)該值為8M,而要讀入的文件是100M,根本就沒有足夠的內(nèi)存來讀入該文件.這個(gè)時(shí)候,我們就需要用到上面的
辦法來解決這個(gè)問題,每次只讀某一段,這樣就可以避免了內(nèi)存的限制
3、靜態(tài)文件緩存
現(xiàn)在很多公司有這么一個(gè)需求, 就是某一個(gè)頁(yè)面在第一次訪問的時(shí)候,會(huì)執(zhí)行PHP,然后把顯示的內(nèi)容返回到瀏覽器,同時(shí)需要把這次顯示的內(nèi)容保存到服務(wù)器上,這樣下次訪問的時(shí)候,就直接把保存在服務(wù)器上的文件直接顯示,而不需要通過PHP來做操作這就是所謂的”靜態(tài)頁(yè)面緩存”.那怎么樣才能做到把內(nèi)容返回到瀏覽器的同時(shí)把數(shù)據(jù)保存到服務(wù)器上呢?這就要用到輸出緩沖區(qū)了.
ob_start(); echo 'aaa'; $string = ob_get_contents(); file_put_contents('a.html', $string); ob_flush(); flush();
與輸出緩沖區(qū)有關(guān)的配置
在PHP.INI中,有兩個(gè)跟緩沖區(qū)緊密相關(guān)的配置項(xiàng)
1.output_buffering
該配置直接影響的是php本身的緩沖區(qū),有3種配置參數(shù).on/off/xK(x為某個(gè)整型數(shù)值);
on - 開啟緩沖區(qū)
off - 關(guān)閉緩沖區(qū)
256k - 開啟緩沖區(qū),而且當(dāng)緩沖區(qū)的內(nèi)容超過256k的時(shí)候,自動(dòng)刷新緩沖區(qū)(把數(shù)據(jù)發(fā)送到apache);
2.implicit_flush
該配置直接影響apache的緩沖區(qū),有2種配置參數(shù). on/off
on - 自動(dòng)刷新apache緩沖區(qū),也就是,當(dāng)php發(fā)送數(shù)據(jù)到apache的緩沖區(qū)的時(shí)候,不需要等待其他指令,直接就把輸出返回到瀏覽器
off - 不自動(dòng)刷新apache緩沖區(qū),接受到數(shù)據(jù)后,等待刷新指令
與緩沖區(qū)有關(guān)的函數(shù)
1.ob_implicit_flush
作用和implicit_flush一樣,是否自動(dòng)刷新apache的緩沖區(qū)
2.flush
作用是發(fā)送指令到apache,讓apache刷新自身的輸出緩沖區(qū).
3.ob_start
打開輸出緩沖區(qū),無(wú)論php.ini的文件如何配置,如果使用該函數(shù),即使output_buffering設(shè)置成off,也會(huì)打開輸出緩沖區(qū)
ob_start函數(shù)還接受一個(gè)參數(shù),該參數(shù)是一個(gè)函數(shù)的回調(diào),意思是,在輸入緩沖區(qū)內(nèi)容之前,需要使用調(diào)用傳遞進(jìn)來的參數(shù)把緩沖區(qū)的內(nèi)容處理一次,再放入緩沖區(qū)內(nèi)
4.ob_flush
指示php本身刷新自身的緩沖區(qū),把數(shù)據(jù)發(fā)送到apache
5.ob_clean
清除php緩沖區(qū)里面的內(nèi)容
6.ob_end_clean
清除php緩沖區(qū)內(nèi)的內(nèi)容,并且關(guān)閉輸出緩沖區(qū)
7.ob_end_flush
把php自身的緩沖區(qū)里的內(nèi)容發(fā)送到apache,并把清除自身緩沖區(qū)內(nèi)的內(nèi)容
8.ob_get_clean
獲取緩沖區(qū)的內(nèi)容之后,清除緩沖區(qū).
9.ob_get_contents
獲取輸出緩沖區(qū)里的內(nèi)容
10.ob_get_flush
獲取緩沖區(qū)里的內(nèi)容,并且把這些內(nèi)容發(fā)送到apache
11.ob_get_length
獲取緩沖區(qū)里內(nèi)容的長(zhǎng)度
12.ob_list_handlers
獲取運(yùn)行ob_start時(shí),所回調(diào)的函數(shù)名稱, 例如:
ob_start(‘ob_gzhandler’);
print_r(ob_list_handlers);
將打印出ob_gzhandler;
13.ob_gzhandler
該函數(shù)的作用是作為ob_start的回調(diào)參數(shù), 在緩沖區(qū)刷新之前,會(huì)調(diào)用該函數(shù)對(duì)數(shù)據(jù)進(jìn)行到底gzip或者deflate壓縮.這個(gè)函數(shù)需要zlib擴(kuò)展的支持.
本文名稱:php怎么清除緩沖區(qū)?
文章鏈接:http://www.rwnh.cn/article24/cpgsje.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、響應(yīng)式網(wǎng)站、軟件開發(fā)、網(wǎng)站策劃、電子商務(wù)、定制開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)