php接口调用实例源代码,小蚂蚁学习APP接口开发(7)—— APP接口实例——读取缓存方式开发APP接口的代码案例...
從數(shù)據(jù)庫中直接讀取數(shù)據(jù),雖然時(shí)效性很強(qiáng),但是對數(shù)據(jù)庫造成很大壓力,尤其是在高訪問量的情況下。這時(shí)候可以通過緩存,來有效的緩解了這一壓力,雖然時(shí)效性有些不足,但是服務(wù)器的抗壓能力卻達(dá)到了很大的提高。
讀取緩存方式的中心思想:
當(dāng)請求進(jìn)來時(shí),先查看是否有緩存,如果有并且緩存還在有效時(shí)間內(nèi),不再查詢數(shù)據(jù)庫,直接返回緩存即可;如果沒有或者已經(jīng)過了有效時(shí)間,查詢數(shù)據(jù)庫,返回?cái)?shù)據(jù),同時(shí)生成一份新的緩存,供以后使用。
代碼案例,還是在前幾天的代碼基礎(chǔ)上進(jìn)行改造完善。
做了一些修改,將原來cacheData()方法中的第三個(gè)參數(shù),由path修改成了cacheTime,用來記錄緩存的有效時(shí)間。在方法中增加了,寫入緩存時(shí)間的邏輯,和判斷緩存文件是否過期的邏輯,如下:
/********************************
*
*???修改File類,cacheData方法中加入了緩存時(shí)間參數(shù)
*???學(xué)php的小螞蟻
*???原創(chuàng)博客?http://my.oschina.net/woshixiaomayi/blog
*
***************************/
class?File{
//緩存文件的路徑
private?$_dir;
//緩存文件的默認(rèn)路徑
const?EXT='.txt';
//構(gòu)造方法生成目錄
function?__construct(){
$this->_dir??=???dirname(__FILE__).'/files/';
if(!is_dir($this->_dir)){
mkdir($this->_dir,0777);
}
}
/*************************
*
*???緩存文件的生成,修改,刪除,第三個(gè)參數(shù)改成了緩存時(shí)間
*???$value有值,寫入。無值,讀出。為null,刪除
*???@param??????string????????$key???文件名
*???@param??????mixed?????$value?????緩存的數(shù)據(jù)
*???@param??????int????????$cacheTime??緩存文件的有效時(shí)間
*???return??????mixed????????返回值為布爾值,字符串,整型
*
*******************/
public?function?cacheData($key,$value='',$cacheTime=0){
//緩存文件的全路徑
$filename???=???$this->_dir.$key.self::EXT;
//如果value為null,這刪除這個(gè)靜態(tài)緩存
if(is_null($value)){
return?@unlink($filename);
}
//如果$value不等于空,說明是寫入操作
if($value?!=?''){
//判斷提交的path是否存在
$dir???=???dirname($filename);
if(!is_dir($dir)){
mkdir($dir,0777);
}
/*
在進(jìn)行寫入操作的時(shí)候,附帶上緩存有效時(shí)間
有效時(shí)間為11位的整形,不足11位在前端用0補(bǔ)足
這樣做方便截取
*/
$cacheTime=sprintf('%011d',$cacheTime);
//將緩存有效時(shí)間拼接數(shù)據(jù)json,保存到文件
return?file_put_contents($filename,$cacheTime.json_encode($value));
}elseif($value?==?''){????//說明是讀取操作
if(is_file($filename)){
/*
因?yàn)榧尤肓司彺鏁r(shí)間,需要將它們拆分開來,進(jìn)行判斷,
緩存是否過期,如果沒有過期,返回?cái)?shù)據(jù),如果過期了,
刪除源文件,返回false。
*/
$content=file_get_contents($filename);
//拿到本文件的緩存有限時(shí)間
$time=(int)substr($content,0,11);
/*
進(jìn)行判斷緩存是否可用
1.判斷過期時(shí)間是不是永久緩存(為0則是永久緩存)
2.緩存時(shí)間加上文件修改時(shí)間是否小于現(xiàn)在時(shí)間,如果小于
則已經(jīng)過期
*/
if($time?!=?0?&&?($time?+?filemtime($filename)?
//緩存文件不可用,刪除該文件,返回false
unlink($filename);
return?false;
}
//緩存數(shù)據(jù)可用,拿出數(shù)據(jù),直接返回
$value=substr($content,11);
return?json_decode($value,true);
}else{
return?false;
}
}
}
}
?>
邏輯代碼中,需要作出判斷,是否存在緩存文件。有并且沒有過期,則使用緩存文件,不再讀取數(shù)據(jù)庫,沒有或者已經(jīng)過期,則走查詢數(shù)據(jù)庫的步驟,同時(shí)生成緩存文件。代碼中的echo 123,是測試使用,注釋已經(jīng)做出了說明。
/***********************************
*
*讀取數(shù)據(jù)庫的方式開發(fā)首頁接口
*學(xué)php的小螞蟻
*博客?http://my.oschina.net/woshixiaomayi/blog
*
************************************/
//載入前天寫的db類
//代碼內(nèi)容請參考?http://my.oschina.net/woshixiaomayi/blog/518295
require_once('./db.php');
//載入之前寫好的接口響應(yīng)類
//代碼內(nèi)容請參考?http://my.oschina.net/woshixiaomayi/blog/517384
require_once('./response.php');
//載入剛剛改造好的文件靜態(tài)緩存類
require_once('./file.php');
//接收分頁數(shù)據(jù)?page?為當(dāng)前第幾頁??pagesize?一頁多少數(shù)據(jù)
$page=isset($_GET['page'])?$_GET['page']:1;
$pagesize=isset($_GET['pagesize'])?$_GET['pagesize']:5;
//檢測這兩個(gè)數(shù)值是否為數(shù)字
if(!is_numeric($page)?or?!is_numeric($pagesize)){
//不是數(shù)字,發(fā)送錯(cuò)誤提示
/*
這里之所以使用了一個(gè)return是加強(qiáng)了程序的可讀性,因?yàn)閷Τ绦虿皇煜さ某绦騿T,不知道
在show方法中有exit,加上一個(gè)return,其他人就會知道執(zhí)行到這一步之后,程序就會停止,
后面的程序就不會執(zhí)行了。方便了其他人,大家好才是真的好\(^o^)/YES!
*/
return?Response::show(400,'參數(shù)不合法');
}
//設(shè)置分頁所需要的偏移量
$offset=($page-1)*$pagesize;
//編寫sql語句
$sql="select?*?from?ecm_member?limit?".$offset.",".$pagesize;
//實(shí)例化文件緩存類,查看是否存在有效時(shí)間內(nèi)的緩存文件
$file=new?File();
if(!$index_data=$file->cacheData('list'.$page.'_'.$pagesize)){
/*
此處為調(diào)試,在第一次訪問的時(shí)候,echo?的123可以出現(xiàn),之后訪問,由于
已經(jīng)生成緩存,則不再走這一步,所以123不會出現(xiàn)。直到有效時(shí)間過去,才會
再次出現(xiàn)
*/
echo?123;
//如果連接數(shù)據(jù)庫的時(shí)候出錯(cuò),獲取信息,并將自定義的信息返回
//以免將錯(cuò)誤直接暴露給用戶
try{
$connect?=Db::getInstance()->connect();
}catch(Exception?$e){
//返回給APP的錯(cuò)誤提示
return?Response::show(400,'mysql?not?connect');
}
//數(shù)據(jù)庫連接成功,執(zhí)行sql語句,獲取結(jié)果集
$result=mysql_query($sql,$connect);
$index_data=array();
while($row=mysql_fetch_assoc($result)){
$index_data[]=$row;
}
$file->cacheData('list'.$page.'_'.$pagesize,$index_data,15);
}
if($index_data){
//所需的結(jié)果數(shù)據(jù)拿到,返回?cái)?shù)據(jù)
return?Response::show(200,'內(nèi)容獲取成功',$index_data);
}else{
//沒有拿到,返回錯(cuò)誤提示
return?Response::show(400,'首頁數(shù)據(jù)獲取失敗');
}
?>
讀取緩存方式開發(fā)接口的思想基本上就是這樣了,很好理解,不過這里用了一個(gè)最笨的方法,在本地保存文件的形式做了緩存,其實(shí)可以使用一些更高級的服務(wù),例如memcache、redis等進(jìn)行緩存,效率更高,有時(shí)間的話,使用這兩種服務(wù)再測試一下????~(~ ̄▽ ̄)~????加了個(gè)油。
總結(jié)
以上是生活随笔為你收集整理的php接口调用实例源代码,小蚂蚁学习APP接口开发(7)—— APP接口实例——读取缓存方式开发APP接口的代码案例...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php xml写入数据库中,PHP读取x
- 下一篇: nginx如何处理php请求,Nginx