PHP 开发 APP 接口 学习笔记与总结 - APP 接口实例 [3] 首页 APP 接口开发方案 ② 读取缓存方式
以静态缓存为例。

修改 file.php line:11 去掉 path 参数(方便),加上缓存时间参数:
public function cacheData($k,$v = '',$cacheTime = 0){
//文件名
$filename = $this->_dir.$k.'.'.self::EXT;
.....
line:25 把缓存时间设置为 11 位的数字,如果不满 11 位,则在时间前面补 0。再把缓存时间和缓存内容进行拼接:
$cacheTime = sprintf('%011d',$cacheTime); //$cacheTime 设置为11位(方便截取),不满11位前面补0
//把缓存时间拼接$v
return file_put_contents($filename,$cacheTime.json_encode($v));
测试一下:
$file = new Cache();
$file->cacheData('data','index-data',50);
打开 data.txt:
00000000050"index-data"
再修改读取缓存 line33:
$contents = file_get_contents($filename);
$cacheTime = (int)substr($contents,0,11);
$val = substr($contents,11);
if($cacheTime != 0 && $cacheTime+filemtime($filename) < time()){ //缓存已经失效
unlink($filename);
return false;
}
return json_decode($val,true);
在 list.php 中引入 file.php
修改 line:14
$cache = new Cache();
$vals = array();
if(!$vals = $cache->cacheData('index-data'.$page.'-'.$pageSize)){
//echo 'aaaa';exit(); //测试缓存失效
try{
$connect = DB::getInstance()->connect();
}catch(Exception $e){
return Response::show(403,'数据库连接失败');
}
$res = mysql_query($sql,$connect);
while($val = mysql_fetch_assoc($res)){
$vals[] = $val; //二维数组
} if($vals){
$cache->cacheData('index-data'.$page.'-'.$pageSize,$vals,50);
}
测试页面:
http://127.0.0.17/php/APP/list.php?pageSize=10&page=3
缓存失效时(没有注释echo 'aaaa';exit(); ),页面输出:aaa
list.php
<?php
require_once 'response.php';
require_once 'db.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 review where is_enabled = 1 order by creation_time desc limit '.$offset.','.$pageSize;
$cache = new Cache();
$vals = array();
//当没有缓存或者缓存失效时,连接数据库并从数据库中取出数据
//注意当有分页的数据时,需要把分页信息写入文件名
if(!$vals = $cache->cacheData('index-data'.$page.'-'.$pageSize)){
//echo 'aaaa';exit(); //测试缓存失效
try{
$connect = DB::getInstance()->connect();
}catch(Exception $e){
return Response::show(403,'数据库连接失败');
}
$res = mysql_query($sql,$connect);
while($val = mysql_fetch_assoc($res)){
$vals[] = $val; //二维数组
}
//同时把取出的数据存入缓存
if($vals){
$cache->cacheData('index-data'.$page.'-'.$pageSize,$vals,50);
}
}
//如果缓存存在同时没有失效,使用封装的接口类封装缓存中的数据
if($vals){
return Response::show(200,'首页数据获取成功',$vals);
}else{
return Response::show(400,'首页数据获取失败',$vals);
}
测试 http://127.0.0.17/php/APP/list.php?pageSize=10&page=3 生成 index-data3-10.txt
测试 http://127.0.0.17/php/APP/list.php?pageSize=10 生成 index-data1-10.txt
附:file.php:
<?php
class Cache{
//静态缓存文件后缀名
const EXT = 'txt';
//定义缓存文件存放路径
private $_dir;
public function __construct(){
$this->_dir = dirname(__FILE__).'/files/';
} public function cacheData($k,$v = '',$cacheTime = 0){ //默认永久不失效
//文件名
$filename = $this->_dir.$k.'.'.self::EXT;
//$v不为‘’:存储缓存或者删除缓存
if($v !== ''){
//删除缓存
if(is_null($v)){
return @unlink($filename);
}
//存储缓存
$dir = dirname($filename);
if(!is_dir($dir)){
mkdir($dir,0777);
}
$cacheTime = sprintf('%011d',$cacheTime); //$cacheTime 设置为11位(方便截取),不满11位前面补0
//把缓存时间拼接$v
return file_put_contents($filename,$cacheTime.json_encode($v));
}
//读取缓存
if(!is_file($filename)){
return false;
}
$contents = file_get_contents($filename);
$cacheTime = (int)substr($contents,0,11);
$val = substr($contents,11);
if($cacheTime != 0 && $cacheTime+filemtime($filename) < time()){ //缓存已经失效
unlink($filename);
return false;
}
return json_decode($val,true);
}
}
参考:
PHP 开发 APP 接口 学习笔记与总结 - APP 接口实例 [3] 首页 APP 接口开发方案 ② 读取缓存方式的更多相关文章
- PHP 开发 APP 接口 学习笔记与总结 - APP 接口实例 [2] 首页 APP 接口开发方案 ① 读取数据库方式
方案一:读取数据库方式 从数据库读取信息→封装→生成接口数据 应用场景: 数据时效性比较高的系统 方案二:读取缓存方式 从数据库获取信息(第一次设置缓存或缓存失效时)→封装(第一次设置缓存或缓存失效时 ...
- go语言,golang学习笔记1 官网下载安装,中文社区,开发工具LiteIDE
go语言,golang学习笔记1 官网下载安装,中文社区,开发工具LiteIDE Go语言是谷歌2009发布的专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速 ...
- amazeui学习笔记一(开始使用4)--Web App 相关
amazeui学习笔记一(开始使用4)--Web App 相关 一.总结 1.桌面图标(Touch icon)解决方案:终极方案:link标签的rel和href属性: <link rel=&qu ...
- 《疯狂前端开发讲义jQuery+Angular+Bootstrap前端开发实践》学习笔记
<疯狂前端开发讲义jQuery+Angular+Bootstrap前端开发实践>学习笔记 二〇一九年二月十三日星期三2时28分54秒 前提:本书适合有初步HTML.CSS.JavaScri ...
- python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例
python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...
- OGG学习笔记02-单向复制配置实例
OGG学习笔记02-单向复制配置实例 实验环境: 源端:192.168.1.30,Oracle 10.2.0.5 单实例 目标端:192.168.1.31,Oracle 10.2.0.5 单实例 1. ...
- python3.4学习笔记(十一) 列表、数组实例
python3.4学习笔记(十一) 列表.数组实例 #python列表,数组类型要相同,python不需要指定数据类型,可以把各种类型打包进去#python列表可以包含整数,浮点数,字符串,对象#创建 ...
- PHP 开发 APP 接口 学习笔记与总结 - Redis 缓存
Redis 可以定期将数据备份到磁盘中(持久化),同时不仅仅支持简单的key/value 类型的数据,同时还提供list,set,hash等数据结构的存储:Memcache 只是简单的key/valu ...
- PHP开发APP接口学习笔记
习要点概述1.APP接口简介 2.封装通信接口方法 3.核心技术 4.APP接口实例 服务器和客户端进行接口数据通信:服务器 -->数据库|缓存 -->调用接口 -->客户端 服务器 ...
随机推荐
- hrbustoj 1551:基础数据结构——字符串2 病毒II(字符串匹配,BM算法练习)
基础数据结构——字符串2 病毒IITime Limit: 1000 MS Memory Limit: 10240 KTotal Submit: 284(138 users) Total Accepte ...
- SqlServer 临时表 与 表变量(转)
1. 表变量 变量都以@或@@为前缀,表变量是变量的一种,另外一种变量被称为标量(可以理解为标准变量,就是标准数据类型的变量,例如整型int或者日期型DateTime).以@前缀的表变量是本地的,因此 ...
- 安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(五)
25. 安装 Linux Malware Detect (LMD) Linux Malware Detect (LMD) 是 GNU GPLv2 协议下发布的开源 Linux 恶意程序扫描器,它是特别 ...
- Selenium自动化中DOM,XPATH,CSS定位Web页面对象的优劣性分析
加速IE浏览器自动化执行效率:Selenium自动化中DOM,XPATH,CSS定位Web页面对象的优劣性分析 1.技术背景 在Web应用中,用户通过键盘在输入框中输入值和鼠标点击按钮,链 ...
- SU suphasevel命令学习
- 用indexOf判断设备是否是PC端?
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 1076 K尾相等数
时间限制:500MS 内存限制:65536K提交次数:251 通过次数:80 题型: 编程题 语言: C++;C Description 从键盘输入一个自然数K(99999999>K> ...
- 【Linux/unix网络编程】之使用socket进行TCP编程
实验一 TCP数据发送与接收 [实验目的] 1.熟练掌握套接字函数的使用方法. 2.应用套接字函数完成基本TCP通讯,实现服务器与客户端的信息交互. [实验学时] 4学时 [实验内容] 实现一个服务器 ...
- BZOJ3651 : 网络通信
同[ZJOI2012]网络,把每个点拆成C个点然后用LCT维护. #include<cstdio> #include<map> #define P make_pair #def ...
- Robotium查找指定控件
一.通过ID查找控件 Activity act=solo.getCurrentActivity(): int id=act.getResources().getIdentifier("id名 ...