這篇文章主要講解了“php中ob函數(shù)緩沖機(jī)制的詳細(xì)講解”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“php中ob函數(shù)緩沖機(jī)制的詳細(xì)講解”吧!
在麒麟等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都做網(wǎng)站、網(wǎng)站制作 網(wǎng)站設(shè)計(jì)制作按需設(shè)計(jì)網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站設(shè)計(jì),全網(wǎng)整合營銷推廣,外貿(mào)營銷網(wǎng)站建設(shè),麒麟網(wǎng)站建設(shè)費(fèi)用合理。下面就php中ob函數(shù)緩沖機(jī)制通過文字說明加代碼分析的形式給大家展示如下:
對(duì)于一個(gè)剛剛?cè)腴T的php程序員來說,php緩沖區(qū)是幾乎透明的。在他們心目中,一個(gè)echo print_r 函數(shù),數(shù)據(jù)便會(huì)‘嗖'的一聲飛到瀏覽器上,顯示出來。我也一直如此單純地認(rèn)為。 其實(shí),在技術(shù)的世界里,向來都是由簡(jiǎn)單到復(fù)雜,也許那些技術(shù)開發(fā)者開始單純?nèi)缒阄?,但是面?duì)殘酷的現(xiàn)實(shí),不得不調(diào)整策略,以期提高機(jī)器運(yùn)行效率,最后想到了那些讓我們贊嘆的idea。
說到緩沖,也就是buffer,這里必須要和緩存做一下比較,單純地比較定義是無意義的,莫不如看看它們做什么。緩存解決的是如何快速查找利用數(shù)據(jù),節(jié)省cpu消耗問題,而緩沖解決的是高速cpu與低速I/O設(shè)備不匹配的問題。
再說下本文的另一個(gè)主角,ob函數(shù),ob是output_buffering的簡(jiǎn)寫。既然ob函數(shù)是php擴(kuò)展函數(shù),那么ob函數(shù)主要操作的也就是php buffer了。
簡(jiǎn)單說完本文兩個(gè)主角,我們還必須回歸開頭的主題,echo print_r函數(shù)輸出的數(shù)據(jù)是怎么到達(dá)瀏覽器讓用戶看到的呢?實(shí)際上的歷程是這樣的:
復(fù)制代碼 代碼如下:
echo、print_r=>php output_buffering=>webServer buffer=>browser buffer=>browser display
我們可以清楚地看到,從echo、print_r函數(shù)到發(fā)送信息給客戶端經(jīng)歷了兩個(gè)緩沖區(qū),在客戶端還經(jīng)歷了一個(gè)瀏覽器緩沖區(qū)。我們本文主要討論的是php output_buffering。
未使用ob函數(shù)時(shí)緩沖區(qū)的使用情況
我們的代碼很多時(shí)候是根本不使用ob函數(shù)的,那么它們使用緩沖區(qū)了嗎?這要看php設(shè)置情況。緩沖區(qū)是通過php.ini中的output_buffering變量控制的。其默認(rèn)值是off,可以設(shè)置為on來打開buffer。打來buffer后,即便程序中沒有用ob函數(shù),實(shí)際上代碼也是使用了緩沖區(qū)的。另外,不管php.ini中output_buffering的設(shè)置,cli模式下的php始終默認(rèn)是關(guān)閉的。
為什么要是緩沖區(qū)呢?簡(jiǎn)單來說,高速的cpu早早處理完自己的數(shù)據(jù),想通過線路傳遞給用戶,但是線路太窄了,一下輸送不過去。如果引入緩沖區(qū),cpu可以將快速將生成的數(shù)據(jù)放入緩沖區(qū),然后自己哪兒涼快兒哪兒呆著這歇著去了。緩沖區(qū)根據(jù)指令適時(shí)將數(shù)據(jù)輸出。這個(gè)樣就合理解決了高速cpu與低速I/O設(shè)備的矛盾了。
緩沖區(qū)的數(shù)據(jù)什么時(shí)候輸出呢?1,當(dāng)緩沖區(qū)滿了的時(shí)候,緩沖是有容量大小的,到達(dá)極限則會(huì)自動(dòng)輸出內(nèi)容。2,腳本執(zhí)行完畢。很多小程序輸出內(nèi)容沒那么多,總不能等到緩沖區(qū)滿了再輸出吧~這一點(diǎn)再自然不過。
使用ob函數(shù)時(shí)緩沖區(qū)的使用情況
復(fù)制代碼 代碼如下:
ob_start()
打開輸出緩沖。這個(gè)函數(shù)是我們調(diào)用最多的一個(gè)函數(shù)之一。在output_buffering設(shè)置為on或者x k的情況下,這個(gè)函數(shù)與其說是打開輸出緩沖,還不如說將輸出緩沖擴(kuò)充到很大。當(dāng)然在output_buffering設(shè)置為off的條件下,ob_start會(huì)起到打開buffer的作用。ob_start()還可以傳遞一個(gè)可選參數(shù) output_callback 函數(shù),php官方手冊(cè)有詳細(xì)說明。
復(fù)制代碼 代碼如下:
ob_get_contents()
只是得到輸出緩沖區(qū)的內(nèi)容,但不清除它。
復(fù)制代碼 代碼如下:
ob_end_clean()與ob_clean()
這兩個(gè)函數(shù)從字面意思上就可以看出其區(qū)別。前者清除緩沖區(qū)內(nèi)容并且關(guān)閉,后者僅僅是做清除工作。需要注意的是,使用了這兩個(gè)函數(shù),在前面使用了echo、print_r等函數(shù)不會(huì)輸出內(nèi)容。
筆者曾經(jīng)試圖通過print_r打印出ob_get_contents()的內(nèi)容,然后調(diào)用ob_clean()清除緩沖區(qū),以免影響后面對(duì)緩沖區(qū)的操作,屢屢失敗。仔細(xì)想想,print_r的內(nèi)容再次寫入緩沖區(qū),而后面做了ob_clean()的操作,自然不會(huì)有任何輸出。在ob_clean操作之前調(diào)用ob_flush()函數(shù)便可達(dá)到預(yù)想的效果。
復(fù)制代碼 代碼如下:
ob_flush()與flush()
ob_flush()送出緩沖區(qū)的內(nèi)容并且丟棄內(nèi)容。因而在此函數(shù)之前好采用ob_get_contents()獲得緩沖區(qū)內(nèi)容。flush()刷出服務(wù)器端緩沖,并且發(fā)往客戶端。因而從流程上來說,應(yīng)該是先調(diào)用ob_flush()而后再調(diào)用flush函數(shù)。
另外說明下再Apache buffer flush()的工作原理:在apache module的sapi下,flush會(huì)通過調(diào)用sapi_module()的flush成員函數(shù)指針,間接使用apache的api::ap_rflush刷新apache的輸出緩沖區(qū)。當(dāng)然apache其他模塊比如mod_gzip可能改變這個(gè)動(dòng)作的結(jié)果,可能自己進(jìn)行輸出緩沖區(qū),這將導(dǎo)致flush()函數(shù)產(chǎn)生的結(jié)果不會(huì)立即被送到客戶端瀏覽器。
復(fù)制代碼 代碼如下:
ob_get_clean()
如果你已經(jīng)熟練掌握ob_get_contents()和ob_clean(),那這個(gè)函數(shù)就很簡(jiǎn)單了。因?yàn)樗乔皟烧叩慕Y(jié)合體。它主要是得到當(dāng)前緩沖區(qū)的內(nèi)容并刪除當(dāng)前輸出緩沖區(qū)。
ob函數(shù)還有很多,但大部分用法比較簡(jiǎn)單,理解較為容易。大家可以參照php手冊(cè) ,里面會(huì)有詳細(xì)的解釋。本文列出了筆者開始并不是很理解的一些函數(shù),當(dāng)然今后還會(huì)有新的問題出現(xiàn),想到問題并且解決問題,生活的樂趣也許就在此處吧。
感謝各位的閱讀,以上就是“php中ob函數(shù)緩沖機(jī)制的詳細(xì)講解”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)php中ob函數(shù)緩沖機(jī)制的詳細(xì)講解這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司,,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
文章標(biāo)題:php中ob函數(shù)緩沖機(jī)制的詳細(xì)講解-創(chuàng)新互聯(lián)
網(wǎng)頁地址:http://jinyejixie.com/article8/dhosip.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計(jì)、網(wǎng)站內(nèi)鏈、全網(wǎng)營銷推廣、云服務(wù)器、關(guān)鍵詞優(yōu)化、企業(yè)網(wǎng)站制作
聲明:本網(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)
猜你還喜歡下面的內(nèi)容