PHP中重新整理輸出緩衝

2021-06-16 18:48:10 字數 3307 閱讀 9140

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(),客戶端才能立即獲得指令碼的輸出。

引數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  

ob_end_clean();

echo str_pad(" ", 256);

for ($i=100; $i>0; $i--)

?>

以上**應該隔一秒鐘輸出一次$i. 

以上echo str_pad(" ", 256)的目的是ie需要接受到256個位元組之後才開始顯示。 以上**還有以下兩種寫法

?php  

echo str_pad(" ", 256);

for ($i=100; $i>0; $i--)

?>

<?php  

ob_implicit_flush(true);

echo str_pad(" ", 256);

for ($i=100; $i>0; $i--)

?>

另外我們還需要注意重新整理緩衝不光受以上幾方面的影響,還受以下影響:1). 個別web伺服器程式,特別是win32下的web伺服器程式,在傳送結果到瀏覽器之前,仍然會快取指令碼的輸出,直到程式結束為止。有些apache的模組,比如mod_gzip,可能自己進行輸出快取,這將導致flush()函 數產生的結果不會立即被傳送到客戶端瀏覽器。甚至瀏覽器也會在顯示之前,快取接收到的內容。例如 netscape 瀏覽器會在接受到換行或 html 標記的開頭之前快取內容,並且在接受到 標記之前,不會顯示出整個**。一些版本的 microsoft internet explorer 只有當接受到的256個位元組以後才開始顯示該頁面,所以必須傳送一些額外的空格來讓這些瀏覽器顯示頁面內容。

2). php安裝模式的影響。以上方式對於php以apache模組方式安裝的情況,可以直接使用。  如果以fastcgi方式還需要注意以下幾下配置:

a). apache+fcgid+php

fcgidoutputbuffersize 0(預設是65536)

在配置fcgid時, 設定這項值為0, 以上**做重新整理緩衝時,才能達到自己想要的效果。

b).iis+fastcgi+php

responsebufferlimit=0

修改windows\system32\inetsrv\fcgiext.ini下的這一項。

c).nginx+php-fpm

fastcgi_buffer_size 4k;

fastcgi_buffers 8 4k;

fastcgi_busy_buffers_size 4k

gzip off;

php函式說明:

1.string

str_pad

string

$input

,  int

$pad_length

[, string

$pad_string

= " "

[, int

$pad_type

= str_pad_right

]] )

該函式返回 

input

被從左端、右端或者同時兩端被填充到制定長度後的結果。如果可選的 

pad_string

引數沒有被指定,

input

將被空格字元填充,否則它將被 

pad_string

填充到指定長度

2.相關flush類似函式如下

來自:

PHP中重新整理輸出緩衝

php中重新整理輸出緩衝 buffer是乙個記憶體位址空間,linux系統預設大小一般為4096 1kb 即乙個記憶體頁。主要用於儲存速度不同步的裝置或者優先順序不同的 裝置之間傳辦理資料的區域。通過buffer,可以使程序這間的相互等待變少。這裡說乙個通俗一點的例子,你開啟文字編輯器編輯乙個檔案的...

PHP重新整理輸出緩衝

同 樣的道理,在php中,當執行echo,print的時候,輸出並沒有立即通過tcp傳給客戶端瀏覽器顯示,而是將資料寫入php buffer。php output buffering機制,意味在tcp buffer之前,建立了一新的佇列,資料必須經過該佇列。當乙個php buffer寫滿的時候,指令...

PHP中重新整理輸出緩衝詳解

buffer是乙個記憶體位址空間,linux系統預設大小一般為4096 1kb 即乙個記憶體頁。主要用於儲存速度不同步的裝置或者優先順序不同的裝置之間傳辦理資料的區域。通過buffer,可以使程序這間的相互等待變少。這裡說乙個通俗一點的例子,你開啟文字編輯器編輯乙個檔案的時候,你每輸入 乙個字元,作...