控制PHP的輸出 快取並壓縮動態頁面

2021-04-21 08:17:29 字數 3570 閱讀 3292

;?>

告訴php處理器把所有的輸出重定向到乙個內部的快取(buffer)中。在呼叫ob_start之前,沒有輸出會被送到瀏覽器去。

<?php

string ob_get_contents(void)

;?>

該函式將「輸出快取」(output buffer)以字串的形式返回。你可以呼叫該函式把積累下來的輸出送到瀏覽器中。(僅在把buffering功能關閉之後!!)

<?php

int ob_get_length(void)

;?>

返回快取中的字串的長度。

<?php

void ob_end_clean(void)

;?>

清空輸出快取,並將輸出快取關閉。在快取中的內容輸出到瀏覽器之前,必須使用這個函式。

void 501(

[int flag]

)用來開啟/關閉隱含的flush動作開關(預設是關)。如果flush是開的,每次呼叫print

/echo或是其它輸出命令的時候,輸出的內容會被立即送到瀏覽器端。

使用輸出控制來壓縮php輸出

你必須使用php4裡編譯的zlib擴充套件包來壓縮輸出。如果需要的話,可以檢視php文件中有關zlib包的安裝指導。

首先,初始化輸出快取:

<?php

ob_start();

ob_implicit_flush(0)

;?>

之後,用print

,echo

, 或其他你喜歡的方法生成所有輸出內容,例如:

<?php

print

("hey this is a compressed output!");

?>

頁面生成後,我們取回輸出內容:

<?php

$contents = ob_get_contents();

ob_end_clean();

?>

之後,必須檢測瀏覽器是否支援壓縮資料。如果支援,瀏覽器會發給伺服器端乙個accept-encodeing http頭。我們只需檢查$http_accept_encoding變數中是否有「gzip,deflate」字串。

這種方法使用起來既簡單又結構清晰。下面讓我們看看如何生成壓縮的輸出:

<?php

//告訴瀏覽器將要收到的是gzip資料

//當然在此之前,你已經檢查了它們是否支援gzip,x-gzip資料格式

//如果支援的是x-gzip,那麼下面的頭就要用z-gzip來代替

header("content-encoding: gzip");

//顯示gzip檔案的頭

//只需顯示一次

echo "/x1f/x8b/x08/x00/x00/x00/x00/x00";

//計算出檔案的大小和crc碼

$size = strlen($contents);

$crc = crc32($contents);

//壓縮資料

$contents = gzcompress($contents, 9);

//我們不能就這樣輸出,因為crc碼是混亂的。

//如果我在這裡使用「echo $contents」,壓縮的資料會被送出,

//但是卻不完整。檔案最後的四個位元組是crc校驗碼,可是只發出去了三個位元組。

//最後乙個位元組被丟掉了。我不知道這個bug在4.0.2版中解決了沒有,

//不過最好避免錯誤的方法是把正確的crc校驗碼加到壓縮的資料的末尾。

// //把舊的crc校驗碼剝離

$contents = substr($contents, 0, strlen($contents) - 4);

//僅顯示壓縮的資料

echo $contents;

//輸出crc,和原來資料的大小(位元組)

gzip_printfourchars($crc);

gzip_printfourchars($size);

function gzip_printfourchars($val) }

?>

//好了,你還可以按此方式附加上更多的壓縮資料。

要想進行實際的測試,所有的指令碼**如下:

<?php

ob_start();

ob_implicit_flush(0);

print("i'm compressed!/n");

$contents = ob_get_contents();

ob_end_clean();

header("content-encoding: gzip");

echo "/x1f/x8b/x08/x00/x00/x00/x00/x00";

$size = strlen($contents);

$crc = crc32($contents);

$contents = gzcompress($contents, 9);

$contents = substr($contents, 0, strlen($contents) - 4);

echo $contents;

gzip_printfourchars($crc);

gzip_printfourchars($size);

function gzip_printfourchars($val) }

?>

快取php輸出

當php4還沒問世,我不得不使用php3的時候,我對開發一些快取機制來減少資料庫的載入、對檔案系統的訪問十分感興趣。在php3中沒有什麼特別好的方法,但是有了輸出快取之後,在php4中一切變得容易多了。

這有乙個簡單的例子:

<?php

//為請求的uri構造乙個檔名

$cached_file=md5($request_uri);

if((!file_exists("/cache/$cached_file"))||(!is_valid("/cache/$cached_file")))

/如果請求的檔案在快取中且可用,則:

readfile($cached_file);

?>

這是乙個簡單的例子,使用輸出快取,你可以建立乙個複雜的內容生成系統,對不同的塊或程式使用不同的快取機制,等等……

結論 php輸出控制函式對把指令碼生成的輸出重定向到快取中十分有用。為支援gzip的瀏覽器輸出壓過的快取資料可以減少載入時間。也可作為快取機制來減少對資料來源的訪問(資料庫或檔案)

,這對使用xml意義重大。

如果我們用php建立乙個引擎,快取從資料來源得到的資料(xml文件和資料庫)

,並且動態的生成xml格式的內容(沒有外觀-presentation)我們可以得到這些xml的輸出,並使用xslt轉換成任意一種我們想要的外觀格式(html, wap, palm, pdf等)。使用php4的輸出快取和sablotron xslt擴充套件可以很好地完成這個任務。

PHP中動態HTML的輸出技術

你可以在php程式中的任何地方使用 echo hello world 來輸出你想輸出的內容。不過你將遇到以下麻煩 1 當你試圖在hello和world之間加入兩個 或兩個以上 空格,你使用 echo hello world 你得到的輸出還是乙個空格,或者你在行首加入乙個空格,你的空格也將被忽略。2 ...

PHP中動態HTML的輸出技術

你可以在php程式中的任何地方使用 echo hello world 來輸出你想輸出的內容。不過你將遇到以下麻煩 1 當你試圖在hello和world之間加入兩個 或兩個以上 空格,你使用 echo hello world 你得到的輸出還是乙個空格,或者你在行首加入乙個空格,你的空格也將被忽略。2 ...

求100之內的素質並輸出 最優演算法 PHP面試題

曾經第一次面試題中的題目,今天碰巧看到整理一下 當時用了最基本的演算法寫出來了,兩個for迴圈,乙個乙個取餘,是質數就放進結果陣列中 如下,檢查 執行時間的 是來對比三種不同演算法的優劣性 演算法一 每個數都從2開始除,除遍所有比自己小的整數,如果有能整除的,說明不是質數,退出本次迴圈,進行下一次迴...