激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - PHP教程 - PHP flush()與ob_flush()的區(qū)別詳解

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

2020-04-01 19:34PHP教程網(wǎng) PHP教程

本篇文章是對PHP中的flush函數(shù)與ob_flush函數(shù)的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下

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

php output_buffering --- ob_flush()

默認(rèn)情況下,php buffer是開啟的,而且該buffer默認(rèn)值是4096,即1kb。你可以通過在php.ini配置文件中找到output_buffering配置.當(dāng)echo,print等輸出用戶數(shù)據(jù)的時候,輸出數(shù)據(jù)都會寫入到php output_buffering中,直到output_buffering寫滿,會將這些數(shù)據(jù)通過tcp傳送給瀏覽器顯示。你也可以通過 ob_start()手動激活php output_buffering機(jī)制,使得即便輸出超過了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機(jī)制。一旦激活,腳本輸出不再直接出給瀏覽器,而是先暫時寫入php buffer內(nèi)存區(qū)域。
php默認(rèn)開啟output_buffering機(jī)制,只不過,通過調(diào)用ob_start()函數(shù)據(jù)output_buffering值擴(kuò)展到足夠 大 。也可以指定$chunk_size來指定output_buffering的值。$chunk_size默認(rèn)值是0,表示直到腳本運(yùn)行結(jié)束,php buffer中的數(shù)據(jù)才會發(fā)送到瀏覽器。如果你設(shè)置了$chunk_size的大小 ,則表示只要buffer中數(shù)據(jù)長度達(dá)到了該值,就會將buffer中 的數(shù)據(jù)發(fā)送給瀏覽器。
當(dāng)然,你可以通過指定$ouput_callback,來處理buffer中的數(shù)據(jù)。比如函數(shù)ob_gzhandler,將buffer中的數(shù)據(jù)壓縮后再傳送給瀏覽器。
第三個參數(shù):是否擦除緩存,可選,默認(rèn)是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ù)有可能會改變程序當(dāng)前的工作目錄,解決方法是在回調(diào)函數(shù)中自行手動把工作目錄修改回來,用chdir函數(shù),這點似乎不常遇到,遇到的時候記得去查手冊吧。

3.ob_end_flush與ob_end_clean
這二個函數(shù)有點相似,都會關(guān)閉ouptu_buffering機(jī)制。但不同的是,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ù)有可能會改變程序當(dāng)前的工作目錄,解決方法是在回調(diào)函數(shù)中自行手動把工作目錄修改回來,用chdir函數(shù),這點似乎不常遇到,遇到的時候記得去查手冊吧。

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 九九黄色 | 久草在线资源福利站 | 91 免费视频| 国产精品久久久久久久久久了 | 狼网| www.国产一区.com | 日本黄色a视频 | va视频在线 | 美女视频大全网站免费 | 国产精品一区二区三区在线播放 | 色阁阁69婷婷 | 色柚视频网站ww色 | 日本黄网| 欧美成人一区免费视频 | 欧美一级黄色录像片 | 欧美一区在线观看视频 | 久草在线最新 | 色综合精品 | av在线免费播放网站 | 国产在线看片 | 欧美精品99 | 国产精品视频在 | 国产精品99久久99久久久二 | 亚洲电影免费观看高清完整版在线观 | 国产亚洲精品视频中文字幕 | 欧美成人午夜精品久久久 | 免费黄色免费 | 成人免费视频视频在线观看 免费 | 久久久久久久久久91 | 精品乱码久久久久 | 久久久久久久久久久国产精品 | 成人一区二区三区在线 | 双性精h调教灌尿打屁股的文案 | 成人福利软件 | 国产成人高清成人av片在线看 | 国产精品视频yy9299一区 | 欧美成人影院 | 国产高清在线观看av | 免费色片 | sesee99| 欧美一级做一级爱a做片性 91在线视频观看 |