PHP文件快取主要用來減輕資料庫伺服器的壓力,這裡所說的PHP文件靜態快取是指靜態化,直接產生HTML或XML等文字文件,有更新的時候重生成一次,適合於不太變化的頁面。
1.靜態檔案快取
2.Memcache、redis快取
靜態快取:用php把資料組裝好,然後把資料寫入檔案裡。
staticcache.php
<?php class 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
<?php require_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
<?php class 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);//如果没过期,输出缓存内容 } }
快取方式開發首頁介面
<?php require_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;//如果缓存失效输出1 try{ $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
thinkphp的靜態快取用法分析,thinkphp靜態快取_PHP教學#
以上是php靜態檔案緩存的詳細內容。更多資訊請關注PHP中文網其他相關文章!