1. 程式人生 > >向客戶端瀏覽器傳送壓縮後的資料(gzip)

向客戶端瀏覽器傳送壓縮後的資料(gzip)

當向客戶端瀏覽器傳送一個較大的Html頁面或者大的檔案時,會佔用較大的網路頻寬,使得客戶端的響應速度下降。使用壓縮方式,將大的檔案先壓縮,然後再發送,可以降低網路的頻寬。
當向客戶端瀏覽器傳送資料時,大致傳輸過程如下:

這裡寫圖片描述

函式介紹:

string gzencode ( string $data [, int $level = -1 [, int $encoding_mode = FORCE_GZIP ]] )

將字串資料經過gzip方式壓縮後並返回。
data:想要被壓縮的資料
level:壓縮的等級0(最低)-9(最高)

bool ob_start ([ callback $output_callback
[, int $chunk_size [, bool $erase ]]] )

此函式將開啟輸出緩衝。當輸出緩衝啟用後,指令碼將不會輸出內容(除http標頭外),相反需要輸出的內容被儲存在內部緩衝區中。

可選引數 output_callback 函式可以被指定。 此函式把一個字串當作引數並返回一個字串。 當輸出緩衝區被( ob_flush(), ob_clean() 或者相似的函式)沖刷(送出)或者被清洗的時候;或者在請求結束之際輸出緩衝區內容被沖刷到瀏覽器的時候該函式將會被呼叫。 當呼叫 output_callback 時,它將收到輸出緩衝區的內容作為引數 並預期返回一個新的輸出緩衝區作為結果,這個新返回的輸出緩衝區內容將被送到瀏覽器。 如果這個 output_callback 不是一個可以呼叫的函式,此函式 會返回 FALSE

為ob_start指定一個自定義函式:函式內部實現對快取區的資料進行呼叫gzencode函式處理,即可實現對資料的壓縮過程。

測試示例:

//啟用壓縮
if(function_exists('ob_gzip'))
{
    ob_start('ob_gzip');
}

//ob_start的回撥函式
function ob_gzip ($content)
{
    if( !headers_sent() && extension_loaded ("zlib") && strstr ( $_SERVER["HTTP_ACCEPT_ENCODING"], "gzip"
)){ $content = gzencode($content,9); header ("Content-Encoding: gzip"); header ("Content-Length: ".strlen ($content)); } return ($content) ; } //準備一些待壓縮的內容 header("Content-Type:application/pdf"); $content = file_get_contents("./test.pdf"); echo $content; //輸出緩衝區資料 ob_end_flush();