欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PHP flush()與ob_flush()的區(qū)別詳解

 更新時間:2013年06月03日 17:45:25   作者:  
本篇文章是對PHP中的flush函數(shù)與ob_flush函數(shù)的區(qū)別進行了詳細的分析介紹,需要的朋友參考下
buffer ---- flush()
 
buffer是一個內(nèi)存地址空間,Linux系統(tǒng)默認大小一般為4096(1kb),即一個內(nèi)存頁。主要用于存儲速度不同步的設(shè)備或者優(yōu)先級不同的 設(shè)備之間傳辦理數(shù)據(jù)的區(qū)域。通過buffer,可以使進程這間的相互等待變少。這里說一個通俗一點的例子,你打開文本編輯器編輯一個文件的時候,你每輸入 一個字符,操作系統(tǒng)并不會立即把這個字符直接寫入到磁盤,而是先寫入到buffer,當寫滿了一個buffer的時候,才會把buffer中的數(shù)據(jù)寫入磁 盤,當然當調(diào)用內(nèi)核函數(shù)flush()的時候,強制要求把buffer中的臟數(shù)據(jù)寫回磁盤。
同樣的道理,當執(zhí)行echo,print的時候,輸出并沒有立即通過tcp傳給客戶端瀏覽器顯示, 而是將數(shù)據(jù)寫入php buffer。php output_buffering機制,意味在tcp buffer之前,建立了一新的隊列,數(shù)據(jù)必須經(jīng)過該隊列。當一個php buffer寫滿的時候,腳本進程會將php buffer中的輸出數(shù)據(jù)交給系統(tǒng)內(nèi)核交由tcp傳給瀏覽器顯示。所以,數(shù)據(jù)會依次寫到這幾個地方echo/pring -> php buffer -> tcp buffer -> browser

php output_buffering --- ob_flush()

默認情況下,php buffer是開啟的,而且該buffer默認值是4096,即1kb。你可以通過在php.ini配置文件中找到output_buffering配置.當echo,print等輸出用戶數(shù)據(jù)的時候,輸出數(shù)據(jù)都會寫入到php output_buffering中,直到output_buffering寫滿,會將這些數(shù)據(jù)通過tcp傳送給瀏覽器顯示。你也可以通過 ob_start()手動激活php output_buffering機制,使得即便輸出超過了1kb數(shù)據(jù),也不真的把數(shù)據(jù)交給tcp傳給瀏覽器,因為ob_start()將php buffer空間設(shè)置到了足夠大 。只有直到腳本結(jié)束,或者調(diào)用ob_end_flush函數(shù),才會把數(shù)據(jù)發(fā)送給客戶端瀏覽器。

這兩個函數(shù)的使用怕是很多人最迷惑的一個問題,手冊上對兩個函數(shù)的解釋也語焉不詳,沒有明確的指出它們的區(qū)別,似乎二者的功能都是刷新輸出緩存。但在我們文章一開始的代碼中如果講fush()替換成ob_flush(),程序就再不能正確執(zhí)行了。顯然,它們是有區(qū)別的,否則也手冊中直接說明其中一個是另外一個函數(shù)的別名即可了,沒必要分別說明。那么它們的區(qū)別到底是什么呢?

在沒有開啟緩存時,腳本輸出的內(nèi)容都在服務(wù)器端處于等待輸出的狀態(tài) ,flush()可以將等待輸出的內(nèi)容立即發(fā)送到客戶端。

開啟緩存后,腳本輸出的內(nèi)容存入了輸出緩存中 ,這時沒有處于等待輸出狀態(tài)的內(nèi)容,你直接使用flush()不會向客戶端發(fā)出任何內(nèi)容。而 ob_flush()的作用就是將本來存在輸出緩存中的內(nèi)容取出來,設(shè)置為等待輸出狀態(tài),但不會直接發(fā)送到客戶端 ,這時你就需要先使用 ob_flush()再使用flush(),客戶端才能立即獲得腳本的輸出。

一. flush和ob_flush的正確順序,正確應(yīng)是,先ob_flush再flush,如下:
ob_flush();
flush();
如果Web服務(wù)器的操作系統(tǒng)是windows系統(tǒng),那順序顛倒或者不使用ob_flush()也不會出現(xiàn)問題。[有待求證 ] 但是在Linux系統(tǒng)上就無法刷新輸出緩沖。

output buffering函數(shù)
1.bool ob_start ([ callback $output_callback [, int $chunk_size [, bool $erase ]]] )
激活output_buffering機制。一旦激活,腳本輸出不再直接出給瀏覽器,而是先暫時寫入php buffer內(nèi)存區(qū)域。
php默認開啟output_buffering機制,只不過,通過調(diào)用ob_start()函數(shù)據(jù)output_buffering值擴展到足夠 大 。也可以指定$chunk_size來指定output_buffering的值。$chunk_size默認值是0,表示直到腳本運行結(jié)束,php buffer中的數(shù)據(jù)才會發(fā)送到瀏覽器。如果你設(shè)置了$chunk_size的大小 ,則表示只要buffer中數(shù)據(jù)長度達到了該值,就會將buffer中 的數(shù)據(jù)發(fā)送給瀏覽器。
當然,你可以通過指定$ouput_callback,來處理buffer中的數(shù)據(jù)。比如函數(shù)ob_gzhandler,將buffer中的數(shù)據(jù)壓縮后再傳送給瀏覽器。
第三個參數(shù):是否擦除緩存,可選,默認是true,如果設(shè)置為false,則在腳本執(zhí)行結(jié)束前,緩存都不會被清除。
2.ob_get_contents
獲取一份php buffer中的數(shù)據(jù)拷貝。值得注意的是,你應(yīng)該在ob_end_clean()函數(shù)調(diào)用前調(diào)用該函數(shù),否則ob_get_contents()返回一個空字符中。

可以使用ob_get_contents()以字符串形式獲取服務(wù)端緩存的數(shù)據(jù),
使用ob_end_flush()則會輸出被緩存起來的數(shù)據(jù),并關(guān)閉緩存。
而使用ob_end_clean()則會靜默的清除服務(wù)端緩存的數(shù)據(jù),而不會有任何數(shù)據(jù)或其他行為。
服務(wù)端的緩存是堆疊起來的,也就是說你在開啟了ob_start()后,關(guān)閉之前,在其內(nèi)部還 可以開啟另外一個緩存ob_start()。

不過你也要務(wù)必保證關(guān)閉緩存的操作和開啟緩存的操作數(shù)量一樣多。
ob_start() 可以指定一個回調(diào)函數(shù)來處理緩存數(shù)據(jù),如果一個ob_start()內(nèi)部嵌套了另一個ob_start(),我們假定,外層的ob_start(),編號是A,內(nèi)層的ob_start()編號是B,它們各自制定了一個回調(diào)函數(shù)分別是functionA和functionB,那么在緩存B中的數(shù)據(jù)輸出時,它會先輩f(xié)uncitonB回調(diào)函數(shù)處理,再交給外層的functionA回調(diào)函數(shù)處理,之后才能輸出到客戶端。

另外,手冊說,對于某些web服務(wù)器,比如apache,在使用回調(diào)函數(shù)有可能會改變程序當前的工作目錄,解決方法是在回調(diào)函數(shù)中自行手動把工作目錄修改回來,用chdir函數(shù),這點似乎不常遇到,遇到的時候記得去查手冊吧。

3.ob_end_flush與ob_end_clean
這二個函數(shù)有點相似,都會關(guān)閉ouptu_buffering機制。但不同的是,ob_end_flush只是把php buffer中的數(shù)據(jù)沖(flush/send)到客戶端瀏覽器,而ob_clean_clean將php bufeer中的數(shù)據(jù)清空(erase),但不發(fā)送給客戶端瀏覽器。

ob_end_flush調(diào)用之前 ,php buffer中的數(shù)據(jù)依然存在,ob_get_contents()依然可以獲取php buffer中的數(shù)據(jù)拷貝。

而ob_end_flush()調(diào)用之后 ob_get_contents()取到的是空字符串,同時瀏覽器也接收不到輸出,即沒有任何輸出。

可以使用ob_get_contents()以字符串形式獲取服務(wù)端緩存的數(shù)據(jù),使用ob_end_flush()則會輸出被緩存起來的數(shù)據(jù),并關(guān)閉緩存。
而使用ob_end_clean()則會靜默的清除服務(wù)端緩存的數(shù)據(jù),而不會有任何數(shù)據(jù)或其他行為。
服務(wù)端的緩存是堆疊起來的,也就是說你在開啟了ob_start()后,關(guān)閉之前,在其內(nèi)部還可以開啟另外一個緩存ob_start()。不過你也要務(wù)必保證關(guān)閉緩存的操作和開啟緩存的操作數(shù)量一樣多。
ob_start() 可以指定一個回調(diào)函數(shù)來處理緩存數(shù)據(jù),如果一個ob_start()內(nèi)部嵌套了另一個ob_start(),我們假定,外層的ob_start(),編號是A,內(nèi)層的ob_start()編號是B,它們各自制定了一個回調(diào)函數(shù)分別是functionA和functionB,那么在緩存B中的數(shù)據(jù)輸出時,它會先輩f(xié)uncitonB回調(diào)函數(shù)處理,再交給外層的functionA回調(diào)函數(shù)處理,之后才能輸出到客戶端。

另外,手冊說,對于某些web服務(wù)器,比如apache,在使用回調(diào)函數(shù)有可能會改變程序當前的工作目錄,解決方法是在回調(diào)函數(shù)中自行手動把工作目錄修改回來,用chdir函數(shù),這點似乎不常遇到,遇到的時候記得去查手冊吧。

相關(guān)文章

  • Laravel 隊列使用的實現(xiàn)

    Laravel 隊列使用的實現(xiàn)

    這篇文章主要介紹了Laravel 隊列使用的實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • Yii基于數(shù)組和對象的Model查詢技巧實例詳解

    Yii基于數(shù)組和對象的Model查詢技巧實例詳解

    這篇文章主要介紹了Yii基于數(shù)組和對象的Model查詢技巧,結(jié)合實例形式較為詳細的分析了Yii針對數(shù)組及對象的Model查詢使用技巧,需要的朋友可以參考下
    2015-12-12
  • 利用PHP fsockopen 模擬POST/GET傳送數(shù)據(jù)的方法

    利用PHP fsockopen 模擬POST/GET傳送數(shù)據(jù)的方法

    使用php可以模擬post和get傳送數(shù)據(jù)到別的網(wǎng)頁或者是站點,那么怎么傳送數(shù)據(jù)呢?下面由小編給大家介紹利用PHP fsockopen 模擬POST/GET傳送數(shù)據(jù)的方法,需要的朋友一起看看吧
    2015-09-09
  • ThinkPHP的URL重寫問題

    ThinkPHP的URL重寫問題

    ThinkPHP 是一個免費開源的,快速、簡單的面向?qū)ο蟮?輕量級PHP開發(fā)框架,遵循Apache2開源協(xié)議發(fā)布,是為了敏捷WEB應(yīng)用開發(fā)和簡化企業(yè)應(yīng)用開發(fā)而誕生的。在使用過程中我們經(jīng)常需要去掉URL路徑中的index.php,因為帶著真的很別扭。那么我們來解決下這個問題
    2014-06-06
  • laravel 使用auth編寫登錄的方法

    laravel 使用auth編寫登錄的方法

    今天小編就為大家分享一篇laravel 使用auth編寫登錄的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-09-09
  • Codeigniter中禁止A Database Error Occurred錯誤提示的方法

    Codeigniter中禁止A Database Error Occurred錯誤提示的方法

    在默認的情況下,CodeIgniter會顯示所有的PHP錯誤。但是當你開發(fā)程序結(jié)束時,你可能想要改變這個情況。這篇文章主要介紹了Codeigniter中禁止A Database Error Occurred錯誤提示的方法,需要的朋友可以參考下
    2014-06-06
  • PHP生成靜態(tài)頁

    PHP生成靜態(tài)頁

    PHP生成靜態(tài)頁...
    2006-11-11
  • 淺析Yii2緩存的使用

    淺析Yii2緩存的使用

    一個有緩存的框架可以說是一個好的框架。下面小編通過本文給大家介紹yii2中是如何使用緩存的,非常具有參考借鑒價值,感興趣的朋友一起學(xué)習(xí)吧
    2016-05-05
  • Laravel如何自定義command命令淺析

    Laravel如何自定義command命令淺析

    這篇文章主要給大家介紹了關(guān)于Laravel如何自定義command命令的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用Laravel具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 詳解PHP中strlen和mb_strlen函數(shù)的區(qū)別

    詳解PHP中strlen和mb_strlen函數(shù)的區(qū)別

    在PHP中,strlen與mb_strlen是求字符串長度的函數(shù),但是對于一些初學(xué)者來說,如果不看手冊,也許不太清楚其中的區(qū)別
    2014-03-03

最新評論