PHP輸出緩衝控制

1.簡介

           從php腳本echo(print、print_r...)內容以後,是如何顯示給用戶的呢,下面看看流程:php

echo、print => php output_buffering => webServer buffer => browser buff => browser displaynginx

即:腳本輸出 => php的緩衝區設置 => 系統的緩衝區設置(apache、nginx) => 瀏覽器的緩衝區設置 => 顯示給用戶web

         當PHP腳本有輸出時,輸出控制函數能夠用這些來控制輸出。這在多種不一樣狀況中很是有用,尤爲是用來在腳本開始輸出 數據後,發送http頭信息到瀏覽器。輸出控制函數不影響由 header()setcookie()發送的文件頭信息,僅影響象 echo這樣的函數和PHP代碼塊間的數據。apache

 

2.php.ini配置

輸出控制配置選項
名字 默認 可修改範圍 更新日誌
output_buffering "0" PHP_INI_PERDIR  
output_handler NULL PHP_INI_PERDIR 自 PHP 4.0.4 起可用
implicit_flush "0" PHP_INI_ALL 在 PHP <= 4.2.3 版本中是 PHP_INI_PERDIR

output_buffering boolean/integer瀏覽器

該選項設置爲 On 時,將在全部的腳本中使用輸出控制。若是要限制輸出緩衝區的最大值,可將該選項設定爲指定的最大字節數(例如 output_buffering=4096)。從PHP 4.3.5 版開始,該選項在 PHP-CLI 下老是爲 Off。服務器

output_handler stringcookie

該選項可將腳本全部的輸出,重定向到一個函數。例如,將 output_handler 設置爲 mb_output_handler() 時,字符的編碼將被修改成指定的編碼。設置的任何處理函數,將自動的處理輸出緩衝。函數

implicit_flush boolean性能

默認爲 FALSE。如將該選項改成 TRUE,PHP 將使輸出層,在每段信息塊輸出後,自動刷新。這等同於在每次使用 printecho 等函數或每一個 HTML 塊以後,調用 PHP 中的 flush() 函數。編碼

不在web環境中使用 PHP 時,打開這個選項對程序執行的性能有嚴重的影響,一般只推薦在調試時使用。在 CLI SAPI 的執行模式下,該標記默認爲 TRUE

 

3.經常使用相關函數

void    flush(void);                                               //沖刷服務器緩衝內容
    bool    ob_start([callback $fun, int $size, bool $erase]);         //新建一個緩衝區
    void    ob_clean(void);                                            //清空緩衝區內容
    void    ob_flush(void);                                            //沖刷緩衝區內容
    string  ob_get_contents(void);                                     //返回緩衝區的內容
    bool    ob_end_clean(void);                                        //清空緩衝區內容並關閉緩衝區
    bool    ob_end_flush(void);                                        //沖刷緩衝區內容並關閉緩衝區

 

4.小例子

    4.1,關閉PHP緩衝區,隨時輸出

ob_end_clean();      //關閉默認緩衝區
    echo 'hello ';
    flush();             //刷新服務器緩衝
    sleep(3);
    echo  'world';       //3秒後輸出world
    flush();

 

    4.2,啓用PHP緩衝區,主動刷新緩衝

//每秒輸出一句hello world
    ob_end_clean();                 //關閉默認緩衝區
    ob_start();                     //打開新的緩衝區
    for($i = 0; $i < 10; $i ++){
        sleep(1);
        echo 'hello world <br />';
        ob_flush();
        flush();
    }
    ob_end_clean();                 //關閉緩衝區

   

    4.3,保存回顯內容到文件

ob_end_clean();                     //關閉默認緩衝區
    ob_start();                         //打開新的緩衝區
    print_r($_SERVER);                  //放入內容到緩衝區
    $data = ob_get_contents();          //獲得緩衝區內容
    ob_end_clean();                     //清空並關閉緩衝區
    file_put_contents('txt', $data);    //寫入內容到文件
相關文章
相關標籤/搜索