關於php的buffer(緩衝區)

http://www.php20.cn/article/104

傳統的web php的輸出數據,例如echo var_dump ....等等輸出函數(語句)是經過了幾個步驟,最終到瀏覽器展示的呢?

以下是PHP的輸出流程

php echo,var_dump -> php output_buffering -> webServer buffer-> browser buff-> browser display

php輸出語句/函數->php緩衝區配置->web服務器緩衝區配置->瀏覽器緩衝區->瀏覽器顯示

 

本文主要講解php的緩衝區

 

php緩衝區配置主要由php.ini 中的output_buffering配置的,在默認情況下,output_buffering=4096

 

當php輸出數據時,輸出的數據將會先經過output_buffering中,直到數據大於output_buffering配置的值或者php文件執行完畢,則會將數據輸出

 

以下是一個代碼示例:

 

仙士可博客

 

該代碼主要說明了php緩衝區的,先開啓緩衝區,循環輸出100的值,當值爲偶數時,關閉並重新開啓緩衝區,期間輸出$i的值

 

輸出結果爲:

 

仙士可博客

仙士可博客

 

同理,當在web訪問時,php默認開啓4096的緩衝區,當裏面存取的字符串長度超過時,將會進行一次輸出到web服務器,可通過ob_start()和ob_end_flush進行直接的緩衝區控制(此間將會無視output_buffering的值)

 

注意:php-cli默認關閉緩衝區並且無視output_buffering的值,需要通過ob_start()函數進行打開

   ini_set無法修改output_buffering的配置

   當php.ini中php buffer是關閉的,再次調用ob_end_flush()會報warning。

 

至於爲什麼web瀏覽器不能查看到分段輸出的值,原因爲:

web服務器還有一次緩衝區

 

關於http分段輸出 http://blog.csdn.net/xifeijian/article/details/42921827

 

經過幾天的研究,關於瀏覽器分段輸出的代碼:(高版本下apache默認開啓buffer,可通過配置httpd.conf,設置FcgidOutputBufferSize 0來保證不緩存)

1

2

3

4

5

6

7

8

9

10

<?php

for($i=0;$i<1000;$i++){

    echo $i;

 

    ob_flush();//刷新PHP自身緩衝區

 

    flush();//刷新(特指apache)web服務器的緩衝區,輸出數據

 

    sleep(1);

}

nginx分段輸出:

1

2

3

4

5

6

7

8

9

<?php

set_time_limit(0);

ob_end_clean();

ob_implicit_flush();

header('X-Accel-Buffering: no'); // 關鍵是加了這一行。

for($i=0;$i<1000;$i++){

    echo $i;

    sleep(1);

}

 

 

輸出結果爲:

仙士可博客

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章