以静态缓存为例。

修改 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. JPush开发

    主要功能 保持与服务器的长连接,以便消息能够即时推送到达客户端 接收通知与自定义消息,并向开发者App 传递相关信息 SDK集成步骤 1.导入 SDK 开发包到你自己的应用程序项目 解压缩 jpush ...

  2. C语言,输入一个正整数,按由大到小的顺序输出它的所有质数的因子(如180=5*3*3*2*2)

    #include <iostream> using namespace std; int main() { long num; while(cin >> num){ ){ co ...

  3. makefile_1(初识make)

    Makefile有三个非常有用的变量.分别是$@,$^,$<代表的意义分别是: $@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件. LIBS = -lmCFLAGS = - ...

  4. ubuntu用户添加adduser, useradd

    ubuntu和windows一样,可以任意创建或者删除新的用户,windows下比较简单,ubuntu下需要使用命令,不过操作起来不是很繁琐,所以我尽量写的详细一些.  如何创建ubuntu新用户? ...

  5. 关于Java异常和错误的几个问题

    1.Java中什么是Exception? 异常是Java传达给你的系统和程序错误的方式. 在java中,异常功能是通过实现比如Throwable,Exception,RuntimeException之 ...

  6. Android悬浮窗注意事项

    一 动画无法运行 有时候,我们对添加的悬浮窗口,做动画的时候,始终无法运行. 那么,这个时候,我们可以对要做动画的View,再添加一个parent,即容器.将要做动画的View放入容器中. 二 悬浮窗 ...

  7. CI批量更新$this->db->update_batch();

    $this->db->update_batch(); 生成一条update命令是以你提供的数据为基础的,并执行查询.你可以传递一个数组或对象的参数给update_batch()函数.下面是 ...

  8. x264_param_t结构体参数分析

    转自:http://blog.chinaunix.net/uid-17053077-id-1987955.html 参考网上的一些资料,结合个人的理解,对x264中x264_param_t结构体作了初 ...

  9. ML 04、模型评估与模型选择

    机器学习算法 原理.实现与实践——模型评估与模型选择 1. 训练误差与测试误差 机器学习的目的是使学习到的模型不仅对已知数据而且对未知数据都能有很好的预测能力. 假设学习到的模型是$Y = \hat{ ...

  10. js拆分数组

    <script language="javascript"> str="2,2,3,5,6,6"; //这是一字符串 var strs= new A ...