;?>
告訴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
("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開始除,除遍所有比自己小的整數,如果有能整除的,說明不是質數,退出本次迴圈,進行下一次迴...