PHP ob_start()函數是一個功能強大的函數,可以幫助我們處理許多問題。
Output Control 函數可以讓你自由控制腳本中數據的輸出。它非常地有用,特別是對於:當你想在數據已經輸出後,再輸出文件頭的情況。輸出控制函數不對使用header() 或setcookie(), 發送的文件頭信息產生影響,只對那些類似於echo() 和PHP 代碼的數據塊有作用。
所有對header()函數有了解的人都知道,這個函數會發送一段文件頭給浏覽器,但是如果在使用這個函數之前已經有了任何輸出(包括空輸出,比如空格,回車和換行)就會提示出錯。如果我們去掉第一行的ob_start(),再執行此程序,我們會發現得到了一條錯誤提示:"Header had all ready send by"!但是加上ob_start,就不會提示出錯,原因是當打開了緩沖區,echo後面的字符不會輸出到浏覽器,而是保留在服務器,直到你使用flush或者ob_end_flush才會輸出,所以並不會有任何文件頭輸出的錯誤!
下面介紹下如何使用ob_start做簡單緩存。
<?php $time1 = microtime(true); for($i = 0;$i < 9999;$i++) { //echo $i.'<br />'; } echo "<br />"; $time2 = microtime(true); echo $time2 -$time1; // 輸出 0.0010678768158 ?>
沒做緩存的時候,運行時間為 0.0010678768158。
<?php $time1 = microtime(true); $cache_file = "file.txt"; if(file_exists($cache_file)) { $info = file_get_contents($cache_file); echo $info; $time2 = microtime(true); echo $time2 -$time1; exit(); } ob_start(); for($i = 0;$i < 9999;$i++) { //echo $i; } echo "<br />"; $info = ob_get_contents(); file_put_contents($cache_file ,$info); $time2 = microtime(true); echo $time2 -$time1; // 輸出 0.00075888633728 ?>
沒做緩存耗時 0.001秒,做了簡單緩存則為 0.0007秒,緩存後速度稍有提升。
在前面緩存的基礎上進一行加深。大家都知道,js文件不僅不耗費服務器的資源,同時會被下載到客戶端,秩序下載一次,之後就不消耗帶寬了,缺點就是不可以被搜索引擎抓到包,但是對於辦公系統來說,是一個非常好的選擇。
<?php $time1 = microtime(true); function htmltojs($str) { $re=''; $str=str_replace('\','\\',$str); $str=str_replace("'","'",$str); $str=str_replace('"','"',$str); $str=str_replace('t','',$str); $str= split("rn",$str); //已分割成數組 for($i=0;$i < count($str); $i++) { $re.="document.writeln("".$str[$i]."");rn"; //加上js輸出 } $re = str_replace(""); document.writeln("","",$re); return $re; } $cache_file = "file.js"; if(file_exists($cache_file)) { $info = file_get_contents($cache_file); show_script($cache_file); $time2 = microtime(true); echo $time2 -$time1; exit(); } ob_start(); for($i = 0;$i < 9999;$i++) { //echo $i; } echo "<br />"; $info = ob_get_contents(); $info = htmltojs($info); file_put_contents($cache_file ,$info); $time2 = microtime(true); echo $time2 -$time1; ?>
只是簡單地提供一個緩存的思路。