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