以静态缓存为例。

修改 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中的sprintf()函数的学习研究笔记

PHP 开发 APP 接口 学习笔记与总结 - APP 接口实例 [3] 首页 APP 接口开发方案 ② 读取缓存方式的更多相关文章

  1. PHP 开发 APP 接口 学习笔记与总结 - APP 接口实例 [2] 首页 APP 接口开发方案 ① 读取数据库方式

    方案一:读取数据库方式 从数据库读取信息→封装→生成接口数据 应用场景: 数据时效性比较高的系统 方案二:读取缓存方式 从数据库获取信息(第一次设置缓存或缓存失效时)→封装(第一次设置缓存或缓存失效时 ...

  2. go语言,golang学习笔记1 官网下载安装,中文社区,开发工具LiteIDE

    go语言,golang学习笔记1 官网下载安装,中文社区,开发工具LiteIDE Go语言是谷歌2009发布的专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速 ...

  3. amazeui学习笔记一(开始使用4)--Web App 相关

    amazeui学习笔记一(开始使用4)--Web App 相关 一.总结 1.桌面图标(Touch icon)解决方案:终极方案:link标签的rel和href属性: <link rel=&qu ...

  4. 《疯狂前端开发讲义jQuery+Angular+Bootstrap前端开发实践》学习笔记

    <疯狂前端开发讲义jQuery+Angular+Bootstrap前端开发实践>学习笔记 二〇一九年二月十三日星期三2时28分54秒 前提:本书适合有初步HTML.CSS.JavaScri ...

  5. python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例

    python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...

  6. OGG学习笔记02-单向复制配置实例

    OGG学习笔记02-单向复制配置实例 实验环境: 源端:192.168.1.30,Oracle 10.2.0.5 单实例 目标端:192.168.1.31,Oracle 10.2.0.5 单实例 1. ...

  7. python3.4学习笔记(十一) 列表、数组实例

    python3.4学习笔记(十一) 列表.数组实例 #python列表,数组类型要相同,python不需要指定数据类型,可以把各种类型打包进去#python列表可以包含整数,浮点数,字符串,对象#创建 ...

  8. PHP 开发 APP 接口 学习笔记与总结 - Redis 缓存

    Redis 可以定期将数据备份到磁盘中(持久化),同时不仅仅支持简单的key/value 类型的数据,同时还提供list,set,hash等数据结构的存储:Memcache 只是简单的key/valu ...

  9. PHP开发APP接口学习笔记

    习要点概述1.APP接口简介 2.封装通信接口方法 3.核心技术 4.APP接口实例 服务器和客户端进行接口数据通信:服务器 -->数据库|缓存 -->调用接口 -->客户端 服务器 ...

随机推荐

  1. ASP.Net和新对象之context.Server

    描述 Server是一个HttpServerUtility类型的对象,不是一个类名 1.获取服务器上的绝对路径文件名tring ss = context.Server.MapPath("~/ ...

  2. jQuery信息提示工具jquery.poshytip (转载)

    转载地址:http://www.helloweba.com/view-blog-123.html Poshy Tip是一款非常友好的信息提示工具,它基于jQuery,当鼠标滑向链接时,会出现一个信息提 ...

  3. hdu 1010:Tempter of the Bone(DFS + 奇偶剪枝)

    Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  4. 使用pm2常见问题

    一.日志 1.pm2 的log怎么查看?(安装pm2后默认日志的路径为~/.pm2/),可以通过pm2 show (name)来查看某个进程下的日志地址 2.修改日志的输出路径,通过写一个程序启动的配 ...

  5. C#学习笔记(四)——变量的更多内容

    一.类型转换 1.转换的类型 2.隐式转换 bool 和string 没有隐式转换,具有隐式转换的都列在下面的表格 . 记住一个规律,就是由精度低的类型转到精度高的类型是很容易的. 3.显式转换 (1 ...

  6. Android Touch事件传递机制解析

    android系统中的每个ViewGroup的子类都具有下面三个和TouchEvent处理密切相关的方法: 1)public boolean dispatchTouchEvent(MotionEven ...

  7. gui_mainfcn(gui_State, varargin{:});是什么意思

    gui_mainfcn函数执行过程中,要调用各个控件的CreateFcn函数(也就是控件创建的函数)来创建控件.如果对控件的一些属性设置不对,则控件就没法创建,gui_mainfcn函数就不能正确执行 ...

  8. python list append方法

    keyValueResult = {'a': 1, 'b': 2} sendData = [] def set_push_format(ip): data_format = { "endpo ...

  9. throw和throw ex的区别

    之前,在使用异常捕获语句try...catch...throw语句时,一直没太留意几种用法的区别,前几天调试程序时无意中了解到几种使用方法是有区别的,网上一查,还真是,主要是区别在堆栈信息的起始点不同 ...

  10. mvc-1mvc和类(1)

    简单的控制器结构 var Controller = {}; //创建一个users控制器 (Controller.users = function ($) { var nameClick = func ...