PHP开发APP接口(八)
首页接口的开发以及客户端app的演示
方案一:读取数据库方式开发首页接口
从数据库获取信息 封装 生成接口数据
应用场景:数据是时效性比较高的系统
方案二:读取缓存方式开发首页接口
从数据库获取信息 封装写入缓存 设定缓存失效时间 返回数据
在缓存时效内请求是从缓存里面获取数据;
用途:减少数据库的压力,用途很广,搜狐视频,优酷首页
方案三:定时读取缓存方式开发首页接口
定时生成缓存 应用端请求生存好的缓存
方案一:如何获取数据,如何将获取的数据快速生成接口数据
安装start bluestacks安卓模拟器
仿慕课网
<?php
header('Content-Type:utf-8');
//http://app.com/list.php?page=1&pagesize=12
require_once('./reponse.php');
require_once('./ndb.php');
$page = isset($_GET['page'])?$_GET['page']:1;
$pageSize = isset($_GET['pageSize'])?$_GET['pageSize']:1;
if(!is_numeric($page) || !is_numeric($pageSize)){
return Response::show(401,'数据不合法');
}
$offset=($page-1)*$pageSize;
$sql = "select * from dbname where {$string} order by desc limit ".$offset.",".$pageSize;
try{
$ndb=Ndb::getInstance();
$connect = $ndb->connect();
}catch( Exception $e){
//$e->getMessage();
return Response::show(403,'数据库连接失败');
}
$result = mysql_query($sql,$connect);
while($video = mysql_fetch_assoc($result)){
$videos[]=$video;
}
if($vedios){
return Response::show(200,'首页数据获取成功',$videos);
}else{
return Response::show(400,'首页数据获取失败',$videos);
}
?>
在连接数据库的地方抛出一个异常,在连接的地方连接失败接收异常,避免数据连接调用出错
方案二:取缓存的方式开发接口
掌握静态缓存如何是指缓存失效时间
如何设置缓存(案例中使用静态缓存)
http发送请求给服务器
服务器判断是否存在缓存
如果存在就读取缓存返回
如果不存在就去数据库获取数据,并同时生成缓存,设置缓存时间,返回数据
设置静态缓存中的缓存失效时间
<?php
class File(){
private $_dir;
const EXT =".txt";
public function __construct(){
$this->_dir=dirname(__FILE__)."/files/";
}
/**
*按综合方式输出通信数据
*@param string $key 文件名
*@param string $value 数据
*@param integer $cacheTime 缓存失效时间
*@return string
*/
public function cacheData($key,$value='',$cacheTime=0){
$filename=$this->_dir.$key.self::EXT;
if($value !== ""){
if(is_null($value)){
return @unlink($filename);
}
//将value值写入缓存
$dir=dirname($filename);
if(!is_dir($dir)){
mkdir($dir,0777);
}
//时间以秒为单位,不够11位用0补齐;
$cacheTime = sprintf('%011d',$cacheTime);
return file_put_contents($filename,$cacheTime.json_encode($value));
}
if(!is_file($filename)){
return false;
}/*else{
return json_decode(file_get_contents($filename),true);
}*/
$contents=file_get_contents($filename);
$cacheTime = (int)substr($contents,0,11);
$value = substr($contents, 11);
//缓存失效
if($cacheTime !=0 && ($cacheTime + filetime($filename) < time())){
@unlink($filename);
return false;
}else{
return json_decode($value, true);
}
}
}
?>
应用端应用
<?php
header('Content-Type:utf-8');
//http://app.com/list.php?page=1&pagesize=12
require_once('./reponse.php');
require_once('./ndb.php');
require_once('./file.php');
$page = isset($_GET['page'])?$_GET['page']:1;
$pageSize = isset($_GET['pageSize'])?$_GET['pageSize']:1;
if(!is_numeric($page) || !is_numeric($pageSize)){
return Response::show(401,'数据不合法');
}
$offset=($page-1)*$pageSize;
$sql = "select * from dbname where {$string} order by desc limit ".$offset.",".$pageSize;
$cache = new File();
if(!$videos=$cache->cacheData('index-mk-cache'.$page."-".$pageSize)){
try{
$ndb=Ndb::getInstance();
$connect = $ndb->connect();
}catch( Exception $e){
//$e->getMessage();
return Response::show(403,'数据库连接失败');
}
$result = mysql_query($sql,$connect);
while($video = mysql_fetch_assoc($result)){
$videos[]=$video;
}
//记录缓存
if($videos) {
$cache->cacheData('index-mk-cache'.$page.'-'.$pageSize,$values,1200);
}
}
if($vedios){
return Response::show(200,'首页数据获取成功',$videos);
}else{
return Response::show(400,'首页数据获取失败',$videos);
}
?>
方案三:定时读取缓存开发首页接口
学习要点:
掌握如何编写定是脚本程序
理解服务器如何提前准备数据
1.http请求服务器 服务器读取缓存
2.crontab 定时生成缓存数据
vim cron.php
<?php
//让crontab定时执行的脚本程序………… */5 * * * * /usr/bin/php /usr/local/apache2/htdocs/cron.php
//获取video中的六条数据
require_once('./ndb.php');
require_once('./file.php');
$sql = "select * from dbname where {$string} order by desc";
try{
$ndb=Ndb::getInstance();
$connect = $ndb->connect();
}catch( Exception $e){
//$e->getMessage();
//return Response::show(403,'数据库连接失败');
//连接错误写入错误日志;
file_put_contetns('./logs/'.date('Y-m-d'.'txt',$e->getMessage()));
return;
}
$result = mysql_query($sql,$connect);
$videos = array();
while($video = mysql_fetch_assoc($result)){
$videos[]=$video;
}
$file = new File();
if($videos){
//永久生效
$file->cacheData('index_cron_cache',$videos)
}else{
file_put_contetns('./logs/'.date('Y-m-d'.'txt','没有相关数据'));
}
return;
?>
应用端应用
<?php
header('Content-Type:utf-8');
//http://app.com/list.php?page=1&pagesize=12
require_once('./reponse.php');
require_once('./file.php');
$file = new File();
$data = $file->cacheData('index_cron_cache');
if($data){
return Response::show('200','首页获取数据成功',$data);
}else{
return Response::show('400','首页获取数据失败',$data);
}
$page = isset($_GET['page'])?$_GET['page']:1;
$pageSize = isset($_GET['pageSize'])?$_GET['pageSize']:1;
if(!is_numeric($page) || !is_numeric($pageSize)){
return Response::show(401,'数据不合法');
}
exit;
$offset=($page-1)*$pageSize;
$sql = "select * from dbname where {$string} order by desc limit ".$offset.",".$pageSize;
$cache = new File();
if(!$videos=$cache->cacheData('index-mk-cache'.$page."-".$pageSize)){
try{
$ndb=Ndb::getInstance();
$connect = $ndb->connect();
}catch( Exception $e){
//$e->getMessage();
return Response::show(403,'数据库连接失败');
}
$result = mysql_query($sql,$connect);
while($video = mysql_fetch_assoc($result)){
$videos[]=$video;
}
//记录缓存
if($videos) {
$cache->cacheData('index-mk-cache'.$page.'-'.$pageSize,$values,1200);
}
}
if($vedios){
return Response::show(200,'首页数据获取成功',$videos);
}else{
return Response::show(400,'首页数据获取失败',$videos);
}
?>