文档章节

小蚂蚁学习APP接口开发(7)—— APP接口实例——读取缓存方式开发APP接口的代码案例

嗜学如命的小蚂蚁
 嗜学如命的小蚂蚁
发布于 2015/10/19 15:04
字数 1566
阅读 1090
收藏 5
点赞 0
评论 0

    从数据库中直接读取数据,虽然时效性很强,但是对数据库造成很大压力,尤其是在高访问量的情况下。这时候可以通过缓存,来有效的缓解了这一压力,虽然时效性有些不足,但是服务器的抗压能力却达到了很大的提高。

读取缓存方式的中心思想:

    当请求进来时,先查看是否有缓存,如果有并且缓存还在有效时间内,不再查询数据库,直接返回缓存即可;如果没有或者已经过了有效时间,查询数据库,返回数据,同时生成一份新的缓存,供以后使用。

代码案例,还是在前几天的代码基础上进行改造完善。

File静态缓存类    (原来的代码请参考 http://my.oschina.net/woshixiaomayi/blog/517876

    做了一些修改,将原来cacheData()方法中的第三个参数,由path修改成了cacheTime,用来记录缓存的有效时间。在方法中增加了,写入缓存时间的逻辑,和判断缓存文件是否过期的逻辑,如下:

<?php

/********************************
*
*   修改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) < time())){
					//缓存文件不可用,删除该文件,返回false
					unlink($filename);
					return false;
				}
				//缓存数据可用,拿出数据,直接返回
				$value	=	substr($content,11);
                return json_decode($value,true);
            }else{
                return false;
            }
        }
 
    }
}
?>

    逻辑代码中,需要作出判断,是否存在缓存文件。有并且没有过期,则使用缓存文件,不再读取数据库,没有或者已经过期,则走查询数据库的步骤,同时生成缓存文件。代码中的echo 123,是测试使用,注释已经做出了说明。

<?php
/***********************************
*
*	读取数据库的方式开发首页接口
*	学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等进行缓存,效率更高,有时间的话,使用这两种服务再测试一下    ~(~ ̄▽ ̄)~    加了个油。

© 著作权归作者所有

共有 人打赏支持
嗜学如命的小蚂蚁
粉丝 137
博文 161
码字总数 100864
作品 0
郑州
程序员
小蚂蚁学习APP接口开发(6)—— APP接口实例——首页数据接口的案例实现

读取数据的三种方式 读取数据库方式开发首页接口 从数据库获取数据——》封装——》生成接口数 优点:数据时效性比较高的系统 2. 读取缓存方式开发首页接口(用途非常广) 从数据库获取信息—...

嗜学如命的小蚂蚁 ⋅ 2015/10/18 ⋅ 0

小蚂蚁学习APP接口开发(1)—— json方式封装通信接口

前段时间,和公司的一个安卓程序员配合开发一款简单的APP,因为第一次写,时间也紧张,总感觉写的不是那么的完美,趁着这段时间好好总结一下经验。 对于APP的请求,服务器返回的数据类型一般...

嗜学如命的小蚂蚁 ⋅ 2015/10/13 ⋅ 0

小蚂蚁学习APP接口开发(8)—— APP接口实例——服务器定时缓存的方式开发接口

基本的思路:服务器只负责定时更新缓存。请求进来只需要读取缓存就可以了。 服务器定时执行生成缓存的代码: <?php /** crontab 定时生成缓存文件 /usr/bin/php /app/crontab.php* 学php的小...

嗜学如命的小蚂蚁 ⋅ 2015/10/20 ⋅ 0

小蚂蚁学习APP接口开发(9)—— APP版本升级的接口实例

今天的笔记主要来记录最后两个知识要点之一,APP客户端版本升级的接口开发。 APP的开发主要由伟大而神圣的用户来更新,更新的流程应该是这样的: 开启APP——请求初始化接口init.php——检测...

嗜学如命的小蚂蚁 ⋅ 2015/10/21 ⋅ 1

物联网跨平台应用开发

本文由嵌入式企鹅圈原创团队成员Hunter_Zhu提供。 基于H5进行跨平台应用开发是未来的趋势,其具有跨平台兼容、开发门槛低、运维难度低等优势。phonegap、Dcloud等平台已经实现了很多的应用案...

yueqian_scut ⋅ 2017/03/08 ⋅ 0

现货!《PHP7实践指南:o2o网站与App后台开发》京东天猫有售

终于发售了,啥也不想说了,喜欢的或需要的就点击 链接 进去购买吧。 另外此书将作为 2017 PHP全球开发者大会 现场活动用书 天猫购书 包邮 PHP7实践指南:O2O网站与App后台开发 数据库设计 PH...

szxy1234 ⋅ 2017/11/02 ⋅ 0

博客导航——一站式搜索(所有博客的汇总帖)

博客导航——一站式搜索 以后博客肯定会越来越多的,所以这做一个整理,方便各位朋友能快速的锁定自己想要的资源 课程 巧用第三方快速开发Android App 热门第三方SDK及框架 Android Studio G...

qq_26787115 ⋅ 2016/01/08 ⋅ 0

免费人脸识别API接口如何接入使用

EyeKey为开发者提供非常强大的人脸识别接口服务,包括人脸检测、人脸关键点检测、性别年龄检测、1:1人脸比对、1:N相似脸搜索等丰富的开发接口供各位攻城狮调用。并且,免费。下面就详细介绍...

EyeKey云服务 ⋅ 2015/05/20 ⋅ 0

SnappyDB—Android上的NoSQL数据库简介

参考:http://www.open-open.com/lib/view/open1420816891937.html 参考:http://android-arsenal.com/details/1/936 项目GIthub主页:https://github.com/nhachicha/SnappyDB#cookbook 在开......

wei-spring ⋅ 2015/07/05 ⋅ 0

开源框架使用指南

【Android】Retrofit 网络请求 Service,@Path、@Query、@QueryMap... 【Android】Retrofit 网络请求 Service,@Path、@Query、@QueryMap... 别再浪费时间搭框架了,可能最适合的 mvp 框架来...

掘金官方 ⋅ 2017/12/06 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Kubeflow实战系列:利用TFJob导出分布式TensorFlow模型

介绍 本系列将介绍如何在阿里云容器服务上运行Kubeflow, 本文介绍如何使用TfJob导出分布式模型训练模型。 第一篇:阿里云上使用JupyterHub 第二篇:阿里云上小试TFJob 第三篇:利用TFJob运行...

全部原谅 ⋅ 19分钟前 ⋅ 0

007. 深入JVM学习—老年代

老年代空间的主要目的是用于存储由Eden发送来的对象,一般在经历好几次“Minor GC”还会保存下来的对象,才会被复制到老年代,这样就可以存放更多的对象,同时在老年代中执行GC的次数也相对较...

影狼 ⋅ 20分钟前 ⋅ 0

常见的一些C#开源框架或者开源项目

原:https://blog.csdn.net/qq_27825451/article/details/70666044 Json.NET http://json.codeplex.com/ Json.Net 是一个读写Json效率比较高的.Net框架.Json.Net 使得在.Net环境下使用Json更......

whoisliang ⋅ 21分钟前 ⋅ 0

设计模式基本原理

刚开始接触编程这行的时候看过设计模式,当时感觉学这些模式没有太大的用处,当时也看不太懂。但是随着慢慢接触这一行,经过一段时间的编程以后,再回过头来看设计模式,发现设计模式的确是太...

王子城 ⋅ 25分钟前 ⋅ 0

阿里云全面支持IPv6!一文揽尽4位大咖精彩演讲

摘要: 自从去年11月以来,阿里巴巴高度重视数据中心的网络改造、云产品改造、应用及网络改造等多个维度,经过半年以来的建设,阿里云已经完成了域名解析等关键产品的分析,现在阿里云已经完...

传授知识的天使 ⋅ 35分钟前 ⋅ 0

windows Android sdk 配置

1、下载Android SDK,点击安装,直接默认路径即可! 下载地址:http://developer.android.com/sdk/index.html 2、默认路径安装后,安装完成,开始配置环境变量。 3、打开计算机属性——高级系...

阿豪boy ⋅ 38分钟前 ⋅ 0

bash shell script 简明教程

User <--> bash <--> kernel shell is not kernel or part of kernel various shells: tcsh, csh, bash, ksh find the using shell: echo $SHELL find all the shells: cat /etc/shells what......

mskk ⋅ 40分钟前 ⋅ 0

Service Mesh简史

William Morgan Service Mesh是一个相当新的概念,讲它的“历史”似乎有些勉强。就目前而言,Service Mesh已经在部分企业生产环境中运行了超过18个月,它的源头可以追溯到2010年前后互联网公...

好雨云帮 ⋅ 40分钟前 ⋅ 0

10个免费的服务器监控工具

监控你的WEB服务器或者WEB主机运行是否正常与健康是非常重要的。你要确保用户始终可以打开你的网站并且网速不慢。服务器监控工具允许你收集和分析有关你的Web服务器的数据。 有许多非常好的服...

李朝强 ⋅ 53分钟前 ⋅ 0

压缩工具之zip-tar

zip 支持目录压缩。使用yum安装zip包,使用yum安装unzip包 zip 1.txt.zip 1.txt #将1.txt文件压缩,新生成的压缩文件为1.txt.zip,原文件保留 zip -r 123.zip 123/ #-r对目录操作。将123/目录...

ZHENG-JY ⋅ 53分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部