日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php的ob缓存详解

發(fā)布時間:2023/12/31 php 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php的ob缓存详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言引入

先看下面的代碼:    

這個代碼,每次輸出后都有sleep(1),表示程序執(zhí)行暫定一秒,想象中瀏覽器應該是每隔1s鐘,逐漸顯示1到5的,然后事實情況確不是,瀏覽器訪問的時候,等了5s種后,頁面上一下子出現(xiàn)1-55個數(shù)字的。這是為啥?

  那么,我們能不能讓瀏覽器每隔一秒鐘逐步顯示出1-5五個數(shù)字呢?

  在看一段代碼:

神奇的事兒發(fā)生,我們在瀏覽器上看到的情況是每隔一秒鐘出現(xiàn)一個數(shù)字。實現(xiàn)了上面的夢想。

?

上面的代碼中多了個flush,怎么就可以了呢?

解釋上面的情況,我們就要引入下面我要說明的php的ob緩存了。

OB的基本介紹

那ob是啥呢?

ob就是output_buffer(輸出緩存)的簡寫。在瀏覽器請求一個php頁面的過程中,經(jīng)歷了三個緩存

  1、ob緩存

  2、程序緩存

  3、瀏覽器緩存

上面第一個例子,之所以沒有逐步輸出數(shù)字,是因為在php端,把要輸出的東西,全部先放到程序緩存,等全部處理完,在一起返回給瀏覽器,所以你看到的是同時打印1-5五個數(shù)字。?

?

體驗下OB

我們再來看看

運行下如下代碼:

報了個警告:

?為啥呢?哦,因為在header請求頭函數(shù)錢不能有任何的輸出。我前面有打印111,就不行了。

那我加上一個ob_start(),把輸出緩存打開。代碼:

神奇的發(fā)現(xiàn),訪問能正常打印出111222了,不報警告了。

這是為啥呢?

原因是這樣的,通過ob_start()函數(shù),開啟了輸出緩存,之后,echo 111,要輸出的111沒有直接進入程序緩存,而是被放入了ob輸出緩存中,然后執(zhí)行header函數(shù)的時候,這個放入的是程序緩存,之后的222,又放入了ob輸出緩存。后面沒有了代碼,當前php代碼執(zhí)行完畢,ob緩存中的111和222再刷入程序緩存,這個時候,header是先于111和222在程序緩存中的,好比header在111222前面,就不會報錯了。最后,程序緩存中的數(shù)據(jù),再一起全部輸出要瀏覽器。

?

OB總結

我們總結下關于ob的幾個知識點

 1、 在程序中,如果我們開啟了ob緩存,那么頁面上的輸出(打印)部分數(shù)據(jù),首先會放入ob緩存中。最后在輸入程序緩存輸出去瀏覽器。

 2、我們開啟ob緩存的兩個方法:

    1、通過php.ini,找到output_buffering選項,=Off:關閉 ?=On:開啟 ?=4096:開啟,并且緩存空間為4096個字節(jié)

      通過配置文件開啟,作用于全部php頁面

    2、在當前頁面使用ob_start()函數(shù)開啟,僅作用于當前php頁面。

 3、當php執(zhí)行到最后,則會自動把ob緩存中的數(shù)據(jù)(如果有的話),強制刷新到程序緩存,然后通過web服務器apache等,對數(shù)據(jù)封裝成http響應包,返回給瀏覽器。

 4、如果沒有ob緩存,那么要輸出的所有數(shù)據(jù)直接放入程序緩存

 5、header信息,不管你有沒有開啟ob緩存,總是被放入程序緩存

  

在ob中,我們常用的幾個函數(shù):

  ob_start() //打開ob緩存

  ob_clearn() //清除ob緩存中的內容,但是不關閉ob

  ob_end_clearn() //清除ob緩存中的內容,并且關閉ob

  ob_flush()  //把ob緩存中的內容,刷新到程序緩存,但是不關閉ob

  ob_end_flush() //把ob緩存中的內容,刷新到程序緩存,并且關閉ob

  ob_get_contents() //獲取ob緩存中的內容

  要怎么去理解整幾個函數(shù)呢,我們還是看幾個例子吧!

?

  例子1:

  

  上面的代碼頁面輸出是啥?111222333

  文件里打印的是啥?    111222

  我們逐行分析:

    8:開啟ob緩存,后面的輸出都會被放入ob緩存

    9:111放入ob緩存

    10:header放入程序緩存

    11:222放入ob緩存

    12:此時ob緩存中有111222,被獲取到$ob_str中,所以文件里打印的是111222(明白了)

    14:333放入ob緩存

    最后代碼執(zhí)行完畢,此時ob緩存中是111222333,被全部自動刷新到程序緩存,輸入到瀏覽器

    

    例子2:

    

    瀏覽器輸出:222333?    最先放入緩存的111在ob_get_contents和刷新到程序緩存的時候被ob_clean清理了

    文件打印:222

    

    例子3:

    

    瀏覽器輸出:222333

    文件打印:空 ? 因為獲取的時候,ob緩存被清空了并且關閉

?

    例子4:

    

    瀏覽器輸入:報warning。 ?原因:111先放入ob緩存,緊接著ob_end_flush把ob中的111刷新到程序緩存,接下來header才放入程序緩存,結果造型header前有輸出

    文件打印:空

?

    例子5:

    

    瀏覽器輸出:報錯,和上例子一樣

    文件打印:

    

    原因:ob沒有關閉,把下面的報錯信息和222都放入了ob緩存。這里大家注意到了,ob緩存的內容,不僅僅是頁面的打印部分,應該是說頁面最終返回到瀏覽器的所有內容。因為這個,我們可以用ob來做頁面靜態(tài)化

  

   例子6:flush() ?這個函數(shù)在手冊上描述的不太準備,其實他的作用是把 ob程序緩存的內容 刷新到 瀏覽器緩存?

    上面文章開頭就是用到了它。我們要知道,瀏覽器能看到內容,就是把程序緩存刷新到瀏覽器緩存的結果,一般這個過程都是在當當前代碼全部執(zhí)行完畢后,先把ob緩存自動刷新到程序緩存,再自動把程序緩存自動刷新到瀏覽器緩存,最后我們在瀏覽器上看到結果。

   文章開頭的例子中,我們使用了flush(),就可以讓代碼還沒有執(zhí)行完畢,就強制把程序緩存中的內容刷新到瀏覽器,直接在瀏覽器上可見。所以出現(xiàn)了1-5每秒出現(xiàn)一個數(shù)字的情況。

  那為啥前面還加了呢?因為要讓瀏覽器顯示內容,瀏覽器的緩存必須達到一定的字節(jié)數(shù),所以我們在打印1的時候,上面先放1024個空字符,保證瀏覽器能正常輸出內容。

?

?

OB實際開發(fā)中的使用

  ob的使用我簡單介紹下,就是做頁面靜態(tài)化,一個php的動態(tài)頁面,最后在瀏覽器顯示的,肯定是一個html文件。我們利用ob緩存,可以把最終的html頁面獲取到,以靜態(tài)文件的形式保存。之后,在頁面沒有更新的情況下,我們可以直接訪問這個靜態(tài)頁面,達到網(wǎng)站提速的目的

    

?

  

  

轉載于:https://www.cnblogs.com/zmfly/p/6635636.html

總結

以上是生活随笔為你收集整理的php的ob缓存详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。