溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

php如何關(guān)閉緩沖區(qū)

發(fā)布時間:2021-09-29 09:52:05 來源:億速云 閱讀:320 作者:小新 欄目:編程語言

這篇文章主要介紹php如何關(guān)閉緩沖區(qū),文中介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們一定要看完!

php關(guān)閉緩沖區(qū)的方法:1、打開PHP安裝目錄,找到并打開配置文件“php.ini”;2、在配置文件中,找到“output_buffering”項(xiàng),將該項(xiàng)的值設(shè)置為“Off”即可。

本教程操作環(huán)境:windows7系統(tǒng)、PHP7.1版,DELL G3電腦

PHP 緩沖區(qū)(buffer)

腳本輸出信息首先放入buffer,只有當(dāng)buffer滿了或者腳本運(yùn)行完畢,數(shù)據(jù)才會往下一階段轉(zhuǎn)移。在配置文件php.ini可以找到output_buffering設(shè)置項(xiàng),我的默認(rèn)配置(Windows/XAMPP v3.2.2)是4096

php如何關(guān)閉緩沖區(qū)

若設(shè)置成On,緩沖區(qū)可用且無大小限制;

若設(shè)置為Off,緩沖區(qū)不可用;

若設(shè)置為整數(shù),緩沖區(qū)可用且為設(shè)置大小,單位字節(jié)

需要注意的是,ini_set無法設(shè)置buffer大小,在初始化腳本運(yùn)行環(huán)境時,已經(jīng)做好了buffer的定義;cli模式下始終默認(rèn)output_buffering為Off。

那么問題來了,緩沖區(qū)關(guān)閉和打開有什么區(qū)別?緩沖區(qū)初始設(shè)置的大小有什么作用?cli模式默認(rèn)關(guān)閉若業(yè)務(wù)需要能開啟嗎?緩存區(qū)存在有什么好處?

1.      緩沖區(qū)關(guān)閉和打開有什么區(qū)別?

通過代碼檢驗(yàn)

output_buffering配置為4096時,運(yùn)行代碼

php如何關(guān)閉緩沖區(qū)

輸出結(jié)果:在等待3秒鐘后,同時輸出了start和end

Output_buffering配置為Off時,運(yùn)行相同代碼

輸出結(jié)果:先輸出了start,等待3秒鐘后,輸出了end

單一看結(jié)果一模一樣啊~但是觀察其運(yùn)行過程發(fā)現(xiàn)了很驚訝的不同點(diǎn)。若緩沖關(guān)閉,先輸出“start”,等待3秒后再輸出“end”。而緩沖開啟,會等待腳本執(zhí)行完成,一并輸出結(jié)果

這個例子中,flush用于刷新apache的緩沖區(qū),類似讓PHP buffer與瀏覽器建立直接聯(lián)系,好讓我們的注意力能夠?qū)WHP buffer本身。

通過一個形象的例子比喻,PHP的緩沖區(qū)像一個大房子,每次echo等輸出函數(shù)執(zhí)行時,將數(shù)據(jù)扔到這個大房子里,直到腳本執(zhí)行完成或執(zhí)行ob_flush函數(shù),將數(shù)據(jù)從大房子中釋放,扔給了WebServer緩沖區(qū)。關(guān)閉了PHP緩沖區(qū)后,echo函數(shù)執(zhí)行,沒有大房子可以放怎么辦呢,就只好直接交給WebServer緩沖區(qū)了。

通過例子和代碼執(zhí)行結(jié)果,我們能夠明白,所謂PHP buffer,是PHP本身開辟的數(shù)據(jù)存儲中樞站,一系列的ob函數(shù)都是為此操作。(舉幾個例子函數(shù))

ob_clean();            //刪除內(nèi)部緩沖區(qū)的內(nèi)容,不關(guān)閉緩沖區(qū)(不輸出)。

ob_end_clean();        //刪除內(nèi)部緩沖區(qū)的內(nèi)容,關(guān)閉緩沖區(qū)(不輸出)。

ob_get_contents();     //返回緩沖區(qū)的內(nèi)容,不輸出

ob_get_length();       //返回內(nèi)部緩沖區(qū)的長度,如果緩沖區(qū)未被激活,該函數(shù)返回FALSE。

2.      緩沖區(qū)初始設(shè)置的大小有什么作用?

將output_buffering從4096改為5,方便執(zhí)行測試

執(zhí)行代碼

php如何關(guān)閉緩沖區(qū)

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

執(zhí)行代碼

php如何關(guān)閉緩沖區(qū)

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

通過輸出的比較,很能說明區(qū)別了。

緩沖區(qū)只能放5字節(jié)的數(shù)據(jù),放進(jìn)來的小于這個最大值,還能先存存放放,要是大于等于臨界值,那就只好將數(shù)據(jù)踢出去了,這就跟我們手動執(zhí)行了ob_flush函數(shù)一個效果。

3.      cli模式默認(rèn)關(guān)閉若業(yè)務(wù)需要能開啟嗎?

這個問題可以做個補(bǔ)充,非cli模式下,如果php.ini設(shè)置緩沖區(qū)關(guān)閉,但是業(yè)務(wù)需要用到buffer,咋整呢,難不成還要去改配置。當(dāng)然不會那么難搞了,這時候又一個ob函數(shù)來了,

ob_start();            //打開一個輸出緩沖區(qū),所有的輸出信息不再直接發(fā)送到瀏覽器,而是保存在輸出緩沖區(qū)里面。

知道了PHP buffer類似數(shù)據(jù)臨時存儲區(qū)的概念,回過頭再來看看TP5源碼。

php如何關(guān)閉緩沖區(qū)

先看看ob_get_level和ob_get_clean函數(shù)解釋

ob_get_level() :返回輸出緩沖機(jī)制的嵌套級別。

ob_get_clean():得到當(dāng)前緩沖區(qū)的內(nèi)容并刪除當(dāng)前輸出緩沖區(qū)。

從代碼中也能得知一二,若level獲取大于0,獲取緩沖區(qū)的內(nèi)容并刪除緩沖區(qū),再通過ob_start打開一個新的,這也很符合注釋里說明的“重新申請”。

這里解釋下所謂的嵌套,至于level的值啥時候會為0,并且非0的話是什么呢,請將php.ini output_buffering關(guān)閉,輸出看看結(jié)果。另外多次ob_start,多次ob_get_level,來試試對比輸出結(jié)果吧。

先來看看兩種模型

php如何關(guān)閉緩沖區(qū)

php如何關(guān)閉緩沖區(qū)

在多次ob_start打開新的緩沖區(qū)時,數(shù)據(jù)結(jié)構(gòu)的構(gòu)造為第二種,這就是嵌套了。ob_get_level返回了嵌套的級別。

個人理解,嵌套可以套用Java的流機(jī)制來類比,一個緩沖區(qū)的數(shù)據(jù)輸出到下一個緩沖區(qū),然后可以對數(shù)據(jù)做定制化的操作。

現(xiàn)在看TP5源碼,思路就比較清晰了。如果系統(tǒng)初始化了緩沖區(qū),因?yàn)榇笮】赡軙邢拗疲韵葎h除再重新打開。而執(zhí)行ob_start打開的緩存區(qū),它的大小“足夠大”,但是到底有多大,暫時沒有查到具體的說明,只知道,不管寫入數(shù)據(jù)多大,都會直到腳本結(jié)束才會發(fā)送

4.      緩存區(qū)存在有什么好處?

PHP輸出數(shù)據(jù)發(fā)送到WebServer,若echo執(zhí)行一次發(fā)送一次,這加大了資源消耗,不如存儲在內(nèi)存中,統(tǒng)一發(fā)送更有效率。

Web請求包含HTTP頭部,頭部在設(shè)置之前不能有任何的輸出。PHP緩沖區(qū)替我們做好了這步工作,在頭部發(fā)送前輸出各種數(shù)據(jù),緩沖區(qū)會先將頭部信息發(fā)送到WebSever,再統(tǒng)一發(fā)送數(shù)據(jù)報文。

以上是“php如何關(guān)閉緩沖區(qū)”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI