2012年7月26日 星期四

PHP cache demo

1.收到要求
2.檢查要求檔案是否過期
3.重新要新的或將cache給client

<?php 

////////////////////////////
//將從http(或其他)讀來的檔案
//使用範例
//       http://api.taipeibus.kasper.com.tw/?url=http://tw.yahoo.com/
//   http://api.taipeibus.kasper.com.tw/?url=http://imp.5284.com.tw:3621/TaipeiBusService/Route.aspx?DataFormat=json
////////////////////////////

function outputHttpResult($url)//您想抓取的網址
{
 //檔案名稱
 $filename = "./cache/".str_replace("http://imp.5284.com.tw:3621/TaipeiBusService/", "", $url).".html";

 //檢查檔案時間
 $filetime = filemtime($filename);

 if($filetime == 0)
 {
  //無此檔案 要新的
  getApiResultAndSave($url);

 }
 else
 {
  //檔案是否過期
  if((mktime() - $filetime) >= 30)
  {
   //超過30秒 要新的
   getApiResultAndSave($url);
  }
  else
  {
   //還沒超過30秒 給cache的檔案
   readCacheFileAndEcho($filename);
  }
 }

}

//取得http資源存檔並回給client
function getApiResultAndSave($url)
{
 //檔案名稱
 $filename = "./cache/".str_replace("http://imp.5284.com.tw:3621/TaipeiBusService/", "", $url).".html";

 $buffer = file($url); //將網址讀入buffer變數
 
 for($i = 0; $i < sizeof($buffer); $i++) //將每段文字讀出來,以換行為單位,sizeof會傳回共有幾筆
 {
  echo $buffer[$i]; //全部印出來
 }


 // 要寫入的內容
 for($i = 0; $i < sizeof($buffer); $i++) //將每段文字讀出來,以換行為單位,sizeof會傳回共有幾筆
 {
  $word .= $buffer[$i]; //全部接起來
 }

 //$word = $buffer;

 $fh = fopen($filename, "w");
 fwrite($fh, $word);
 fclose($fh);
}

//讀出舊的檔案並回給client
function readCacheFileAndEcho($filename)
{
 $fh = @fopen($filename,"r") or die("READ FILE ERROR!");

 if($fh)
 {
     while(!feof($fh)) 
     {
         echo fgets($fh);
     }
 }

 fclose($fh);
}

?>

沒有留言:

張貼留言