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