首頁  >  文章  >  後端開發  >  PHP中刷新輸出緩衝的詳解

PHP中刷新輸出緩衝的詳解

不言
不言原創
2018-04-23 10:18:081675瀏覽

 這篇文章主要介紹的內容是關於PHP中刷新輸出緩衝的詳解,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

 buffer是一個記憶體位址空間,Linux系統預設大小一般為4096(1kb),即一個記憶體頁。主要用於儲存速度不同步的設備或優先順序不同的設備之間傳辦理資料的區域。透過buffer,可以讓進程這間的相互等待變少。這裡說一個通俗一點的例子,你打開文字編輯器編輯一個文件的時候,你每輸入一個字符,操作系統並不會立即把這個字符直接寫入到磁盤,而是先寫入到buffer,當寫滿了一個buffer的時候,才會把buffer中的資料寫入磁碟,當然當呼叫核心函數flush()的時候,強制要求把buffer中的髒資料寫回磁碟。

      同樣的道理,在PHP中,當執行echo,print的時候,輸出並沒有立即透過tcp傳給客戶端瀏覽器顯示, 而是將資料寫入php buffer。 php output_buffering機制,意義在tcp buffer之前,建立了一新的佇列,資料必須經過該佇列。當一個php buffer寫滿的時候,腳本進程會將php buffer中的輸出資料交給系統核心交由tcp傳給瀏覽器顯示。所以,資料會依序寫到這幾個地方echo/pring -> php buffer -> tcp buffer -> browser


在PHP中與刷新緩衝相關的函數有三個:

1). flush 
#刷新PHP程式的緩衝,而不論PHP執行在何種情況下。此函數將目前為止程式的所有輸出傳送到使用者的瀏覽器。但是該函數不會對伺服器或客戶端瀏覽器的快取模式產生任何影響,也不會對PHP本身的快取產生任何影響。

2).ob_flush

此函數對PHP本身的快取進行輸出。 PHP本身的快取受php.ini中的output_buffering的控制。 ob_flush()的功能就是將原本存在輸出快取中的內容取出來,設定為等待輸出狀態,但不會直接傳送到客戶端,這時你就需要先使用ob_flush()再使用flush(),客戶端才能立即獲得腳本的輸出。

    與PHP本身輸出緩衝相關的兩個PHP配置是:
      參數1:output_buffering :on/off 或整數 。設定為on時,將在所有腳本中使用輸出快取控制,不限制快取的大小。而設定為整數時,如output_buffering=4096,當快取資料達到4096位元組時會自動輸出刷新快取。而這個參數的差異正是導致以上程式碼在不同時候執行結果不同的原因。當output_buffering關閉時,腳本所有的輸出(echo)都會即時傳送到客戶端,執行上面程式碼時就是每秒輸出一個數字。而開啟output_buffering後,輸出內容就會先緩存在服務端,直到腳本結束時才一起傳送給客戶端。
     參數2:implicit_flush:on/off。設定ON意味著,當腳本有輸出時,自動立即傳送到客戶端。相當於在echo後自動加flush()。


3).ob_implicit_flush

這個函數強制每當有輸出的時候,即刻把輸出送到瀏覽器。這樣就不需要每次輸出(echo)後,都用flush()來傳送到瀏覽器了。

以下是範例:


#



[php] view plain copy













#

<?php  
ob_end_clean();  
echo str_pad(" ", 256);  
for ($i=100; $i>0; $i--) {  
   echo $i, &#39;<br/>&#39;;  
   flush();  
   sleep(1);   
}   
?>

以上程式碼應該要隔一秒輸出一次$i.  以上echo str_pad(" ", 256)的目的在於IE需要接受到256個位元組之後才開始顯示。以上程式碼還有以下兩種寫法。



########### ####[php]### view plain### copy################################################################################################################################################ ########
<?php  
echo str_pad(" ", 256);  
for ($i=100; $i>0; $i--) {  
   echo $i, &#39;<br />&#39;;  
   ob_flush();  
   flush();  
   sleep(1);   
}   
?>
#######################################[php ]### view plain### copy######################################### ##
<?php  
ob_implicit_flush(true);  
echo str_pad(" ", 256);  
for ($i=100; $i>0; $i--) {  
   echo $i, &#39;<br />&#39;;  
   ob_flush();  
   sleep(1);   
}   
?>
###############另外我們還要注意刷新緩衝不光受以上幾方面的影響,也受以下影響:############ ##########

1). 個別web伺服器程序,特別是Win32下的web伺服器程序,在發送結果到瀏覽器之前,仍然會快取腳本的輸出,直到程序結束為止。有些Apache的模組,例如mod_gzip,可能會自己進行輸出緩存,這將導致flush()函數產生的結果不會立即被傳送到客戶端瀏覽器。甚至瀏覽器也會在顯示之前,快取接收到的內容。例如 Netscape 瀏覽器會在接受到換行或 html 標籤的開頭之前快取內容,並且在接受到 f16b1740fad44fb09bfe928bcc527e08 標記之前,不會顯示整個表格。某些版本的 Microsoft Internet Explorer 只有在接受到的256個位元組以後才開始顯示該頁面,所以必須傳送一些額外的空格來讓這些瀏覽器顯示頁面內容。

2). PHP安裝模式的影響。以上方式對於PHP以Apache模組方式安裝的情況,可以直接使用。若以FastCgi方式也需要注意以下幾下設定:

##    a). Apache Fcgid PHP

        FcgidOutputBufferSize 0(預設為65536)
## .項值為0, 以上程式碼做刷新緩衝時,才能達到自己想要的效果。

    b).IIS FastCgi PHP

        ResponseBufferLimit=0

        修改WINDOWS\system32\ts#        修改WINDOWS\system32\ts#        修改WINDOWS\system32\ts#   

    c).nginx php-fpm

        

fastcgi_buffer_size 4k   

fastcgi_buffers 8 4k;        fastcgi_busy_buffers_size 4k##  gzip off;<br><br>

#相關推薦:

詳解透過刷新PHP緩衝區為你的網站加速

<a href="http://www.php.cn/php-weizijiaocheng-384170.html" target="_self"></a>

以上是PHP中刷新輸出緩衝的詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn