PHP檔案快取主要用來減輕資料庫伺服器的壓力,這裡所說的PHP檔案靜態緩衝是指靜態化,直接產生HTML或XML等文字檔,有更新的時候重產生一次,適合於不太變化的頁面。
1.靜態檔案快取
2.Memcache、redis緩衝
靜態緩衝:用php把資料群組裝好,然後把資料寫入檔案裡。
staticcache.php
<?phpclass File{ private $_dir;//定義一個預設的路徑 const EXT = '.txt';//定義一個檔案名稱尾碼的常量 public function __construct(){ $this->_dir = dirname(__FILE__).'/files/';//擷取檔案的目前的目錄,再放到該目錄下的files檔案夾中,然後賦給$_dir } //把產生/擷取/刪除緩衝這三個操作封裝在cacheData方法中 public function cacheData($key,$value = '',$path = ''){ $filename = $this->_dir.$path.$key.self::EXT;//拼裝成一個檔案:預設目錄、路徑、檔案名稱、檔案名稱尾碼 //將value值寫入緩衝 if($value !== ''){ //刪除緩衝 if (is_null($value)){ return @unlink($filename);//unlink刪除檔案,@忽略警告 } $dir = dirname($filename); if(!is_dir($dir)){//如果目錄不存在就建立目錄,首先要擷取這個目錄 mkdir($dir,0777); } return file_put_contents($filename, json_encode($value));} //擷取緩衝 if(!is_file($filename)){ return FALSE; }else{ return json_decode(file_get_contents($filename),true); } }}
test.php
<?phprequire_once('./staticcache.php');$data = array('id' => 1,'name' => 'panda','number' => array(1,7,8));$file = new File();//擷取緩衝if($file->cacheData('index_cache')){ var_dump($file->cacheData('index_cache'));exit; echo "success";}else{ echo "error";}
設定靜態緩衝時間最佳化後:
cachetime.php
<?phpclass File{ private $_dir;//定義一個預設的路徑 const EXT = '.txt';//定義一個檔案名稱尾碼的常量 public function __construct(){ $this->_dir = dirname(__FILE__).'/files/';//擷取檔案的目前的目錄,再放到該目錄下的files檔案夾中,然後賦給$_dir } //把產生/擷取/刪除緩衝這三個操作封裝在cacheData方法中 public function cacheData($key,$value = '',$cacheTime = 0){//不傳cacheTime永久有效 $filename = $this->_dir.$key.self::EXT;//拼裝成一個檔案:預設目錄、路徑、檔案名稱、檔案名稱尾碼 //將value值寫入緩衝 if($value !== ''){//刪除緩衝if (is_null($value)){return @unlink($filename);//unlink刪除檔案,@忽略警告}$dir = dirname($filename);if(!is_dir($dir)){//如果目錄不存在就建立目錄,首先要擷取這個目錄mkdir($dir,0777);}$cacheTime = sprintf('%011d',$cacheTime)//規定緩衝時間格式,不足11位,則前面補0,方便擷取時截取return file_put_contents($filename, $cacheTime.json_encode($value));//緩衝時間與資料拼接} //擷取緩衝if(!is_file($filename)){return FALSE;}$contents = file_get_contents($filename);$cacheTime = (int)substr($contents,0,11);$value = substr($contents,11);if($cacheTime !=0 && ($cacheTime + fileatime($filename)<time())){//判斷是否到期unlink($filename);//緩衝失效刪除檔案return FALSE;}return json_decode($value,true);//如果沒到期,輸出緩衝內容}}
緩衝方式開發首頁介面
<?phprequire_once('./jsonxml.php');require_once('./db.php');require_once('./cachetime.php');$page = isset($_GET['page']) ? $_GET['page'] : 1;$pageSize = isset($_GET['pagesize']) ? $_GET['pagesize'] : 6;if(!is_numeric($page)||!is_numeric($pageSize)){return Response::show(401,'資料不合法');}$offset = ($page - 1) * $pageSize;$sql = "select * from video where status = 1 order by orderby desc limit ".$offset.",".$pageSize;//4-4 讀取緩衝方式開發首頁介面$cache = new File();$videos = array();if(!$videos = $cache->cacheData('index_yjp_cache'.$page.'-'.$pageSize)){echo 1;exit;//如果緩衝失效輸出1try{$connect = Db::getInstance()->connect();}catch(Exception $e){return Response::show(403,'資料庫連結失敗');}$result = mysql_query($sql,$connect);$videos = array();while ($video = mysql_fetch_assoc($result)){$videos[] = $video;}if($videos){$cache->cacheData('index_yjp_cache'.$page.'-'.$pageSize,$videos,1200);}}if($videos){return Response::show(200,'首頁資料擷取成功',$videos);}else{return Response::show(400,'失敗',$videos);}
註:檔案快取注意檔案的到期時間
1.擷取檔案建立時間樣本:
$ctime=filectime("chinawinxp.txt");echo "建立時間:".date("Y-m-d H:i:s",$ctime);
2.擷取檔案修改時間樣本:
$mtime=filemtime("chinawinxp.txt");echo "修改時間:".date("Y-m-d H:i:s",$mtime);
fileatime() 函數返回指定檔案的上次訪問時間
2.memcache和redis緩衝
開啟服務;串連連接埠,快取服務器;php操作php操作redis、mencache條件:
1) 安裝phpredis擴充/mencache擴充
2) php串連redis服務 connet(127.0.0.1,6379);
串連mencache服務 connet('memcache_host',11211);
3) set 設定緩衝
4) get 擷取緩衝
設定緩衝時間:set key time(時間) value
PHP緩衝包括PHP編譯緩衝和PHP資料緩衝兩種。PHP是一種解釋型語言,屬於邊編譯邊啟動並執行那種。這種運行模式的優點是程式修改很方便,但是運行效率卻很低下。PHP編譯緩衝針對這種情況做改進處理,使得PHP語言只要運行一次,就可以把程式的編譯結果緩衝起來。這樣,接下來的每次運行都不需要再次編譯了,這大大提高PHP運行速度。