php的ob缓存详解
前言引入
先看下面的代碼:
這個(gè)代碼,每次輸出后都有sleep(1),表示程序執(zhí)行暫定一秒,想象中瀏覽器應(yīng)該是每隔1s鐘,逐漸顯示1到5的,然后事實(shí)情況確不是,瀏覽器訪問的時(shí)候,等了5s種后,頁(yè)面上一下子出現(xiàn)1-55個(gè)數(shù)字的。這是為啥?
那么,我們能不能讓瀏覽器每隔一秒鐘逐步顯示出1-5五個(gè)數(shù)字呢?
在看一段代碼:
神奇的事兒發(fā)生,我們?cè)跒g覽器上看到的情況是每隔一秒鐘出現(xiàn)一個(gè)數(shù)字。實(shí)現(xiàn)了上面的夢(mèng)想。
?
上面的代碼中多了個(gè)flush,怎么就可以了呢?
解釋上面的情況,我們就要引入下面我要說明的php的ob緩存了。
OB的基本介紹
那ob是啥呢?
ob就是output_buffer(輸出緩存)的簡(jiǎn)寫。在瀏覽器請(qǐng)求一個(gè)php頁(yè)面的過程中,經(jīng)歷了三個(gè)緩存
1、ob緩存
2、程序緩存
3、瀏覽器緩存
上面第一個(gè)例子,之所以沒有逐步輸出數(shù)字,是因?yàn)樵趐hp端,把要輸出的東西,全部先放到程序緩存,等全部處理完,在一起返回給瀏覽器,所以你看到的是同時(shí)打印1-5五個(gè)數(shù)字。?
?
體驗(yàn)下OB
我們?cè)賮砜纯?/p>
運(yùn)行下如下代碼:
報(bào)了個(gè)警告:
?為啥呢?哦,因?yàn)樵趆eader請(qǐng)求頭函數(shù)錢不能有任何的輸出。我前面有打印111,就不行了。
那我加上一個(gè)ob_start(),把輸出緩存打開。代碼:
神奇的發(fā)現(xiàn),訪問能正常打印出111222了,不報(bào)警告了。
這是為啥呢?
原因是這樣的,通過ob_start()函數(shù),開啟了輸出緩存,之后,echo 111,要輸出的111沒有直接進(jìn)入程序緩存,而是被放入了ob輸出緩存中,然后執(zhí)行header函數(shù)的時(shí)候,這個(gè)放入的是程序緩存,之后的222,又放入了ob輸出緩存。后面沒有了代碼,當(dāng)前php代碼執(zhí)行完畢,ob緩存中的111和222再刷入程序緩存,這個(gè)時(shí)候,header是先于111和222在程序緩存中的,好比header在111222前面,就不會(huì)報(bào)錯(cuò)了。最后,程序緩存中的數(shù)據(jù),再一起全部輸出要瀏覽器。
?
OB總結(jié)
我們總結(jié)下關(guān)于ob的幾個(gè)知識(shí)點(diǎn)
1、 在程序中,如果我們開啟了ob緩存,那么頁(yè)面上的輸出(打印)部分?jǐn)?shù)據(jù),首先會(huì)放入ob緩存中。最后在輸入程序緩存輸出去瀏覽器。
2、我們開啟ob緩存的兩個(gè)方法:
1、通過php.ini,找到output_buffering選項(xiàng),=Off:關(guān)閉 ?=On:開啟 ?=4096:開啟,并且緩存空間為4096個(gè)字節(jié)
通過配置文件開啟,作用于全部php頁(yè)面
2、在當(dāng)前頁(yè)面使用ob_start()函數(shù)開啟,僅作用于當(dāng)前php頁(yè)面。
3、當(dāng)php執(zhí)行到最后,則會(huì)自動(dòng)把ob緩存中的數(shù)據(jù)(如果有的話),強(qiáng)制刷新到程序緩存,然后通過web服務(wù)器apache等,對(duì)數(shù)據(jù)封裝成http響應(yīng)包,返回給瀏覽器。
4、如果沒有ob緩存,那么要輸出的所有數(shù)據(jù)直接放入程序緩存
5、header信息,不管你有沒有開啟ob緩存,總是被放入程序緩存
在ob中,我們常用的幾個(gè)函數(shù):
ob_start() //打開ob緩存
ob_clearn() //清除ob緩存中的內(nèi)容,但是不關(guān)閉ob
ob_end_clearn() //清除ob緩存中的內(nèi)容,并且關(guān)閉ob
ob_flush() //把ob緩存中的內(nèi)容,刷新到程序緩存,但是不關(guān)閉ob
ob_end_flush() //把ob緩存中的內(nèi)容,刷新到程序緩存,并且關(guān)閉ob
ob_get_contents() //獲取ob緩存中的內(nèi)容
要怎么去理解整幾個(gè)函數(shù)呢,我們還是看幾個(gè)例子吧!
?
例子1:
上面的代碼頁(yè)面輸出是啥?111222333
文件里打印的是啥? 111222
我們逐行分析:
8:開啟ob緩存,后面的輸出都會(huì)被放入ob緩存
9:111放入ob緩存
10:header放入程序緩存
11:222放入ob緩存
12:此時(shí)ob緩存中有111222,被獲取到$ob_str中,所以文件里打印的是111222(明白了)
14:333放入ob緩存
最后代碼執(zhí)行完畢,此時(shí)ob緩存中是111222333,被全部自動(dòng)刷新到程序緩存,輸入到瀏覽器
例子2:
瀏覽器輸出:222333? 最先放入緩存的111在ob_get_contents和刷新到程序緩存的時(shí)候被ob_clean清理了
文件打印:222
例子3:
瀏覽器輸出:222333
文件打印:空 ? 因?yàn)楂@取的時(shí)候,ob緩存被清空了并且關(guān)閉
?
例子4:
瀏覽器輸入:報(bào)warning。 ?原因:111先放入ob緩存,緊接著ob_end_flush把ob中的111刷新到程序緩存,接下來header才放入程序緩存,結(jié)果造型header前有輸出
文件打印:空
?
例子5:
瀏覽器輸出:報(bào)錯(cuò),和上例子一樣
文件打印:
原因:ob沒有關(guān)閉,把下面的報(bào)錯(cuò)信息和222都放入了ob緩存。這里大家注意到了,ob緩存的內(nèi)容,不僅僅是頁(yè)面的打印部分,應(yīng)該是說頁(yè)面最終返回到瀏覽器的所有內(nèi)容。因?yàn)檫@個(gè),我們可以用ob來做頁(yè)面靜態(tài)化
例子6:flush() ?這個(gè)函數(shù)在手冊(cè)上描述的不太準(zhǔn)備,其實(shí)他的作用是把 ob程序緩存的內(nèi)容 刷新到 瀏覽器緩存?
上面文章開頭就是用到了它。我們要知道,瀏覽器能看到內(nèi)容,就是把程序緩存刷新到瀏覽器緩存的結(jié)果,一般這個(gè)過程都是在當(dāng)當(dāng)前代碼全部執(zhí)行完畢后,先把ob緩存自動(dòng)刷新到程序緩存,再自動(dòng)把程序緩存自動(dòng)刷新到瀏覽器緩存,最后我們?cè)跒g覽器上看到結(jié)果。
文章開頭的例子中,我們使用了flush(),就可以讓代碼還沒有執(zhí)行完畢,就強(qiáng)制把程序緩存中的內(nèi)容刷新到瀏覽器,直接在瀏覽器上可見。所以出現(xiàn)了1-5每秒出現(xiàn)一個(gè)數(shù)字的情況。
那為啥前面還加了呢?因?yàn)橐尀g覽器顯示內(nèi)容,瀏覽器的緩存必須達(dá)到一定的字節(jié)數(shù),所以我們?cè)诖蛴?的時(shí)候,上面先放1024個(gè)空字符,保證瀏覽器能正常輸出內(nèi)容。
?
?
OB實(shí)際開發(fā)中的使用
ob的使用我簡(jiǎn)單介紹下,就是做頁(yè)面靜態(tài)化,一個(gè)php的動(dòng)態(tài)頁(yè)面,最后在瀏覽器顯示的,肯定是一個(gè)html文件。我們利用ob緩存,可以把最終的html頁(yè)面獲取到,以靜態(tài)文件的形式保存。之后,在頁(yè)面沒有更新的情況下,我們可以直接訪問這個(gè)靜態(tài)頁(yè)面,達(dá)到網(wǎng)站提速的目的
?
轉(zhuǎn)載于:https://www.cnblogs.com/zmfly/p/6635636.html
總結(jié)
以上是生活随笔為你收集整理的php的ob缓存详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python黑客帝国代码雨源代码_黑客帝
- 下一篇: rlocfind matlab,绘制根轨