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:

 1 <?php
 2 class Cache{
 3     //静态缓存文件后缀名
 4     const EXT = ‘txt‘;
 5     //定义缓存文件存放路径
 6     private $_dir;
 7     public function __construct(){
 8         $this->_dir = dirname(__FILE__).‘/files/‘;
 9     }
10
11     public function cacheData($k,$v = ‘‘,$cacheTime = 0){ //默认永久不失效
12         //文件名
13         $filename = $this->_dir.$k.‘.‘.self::EXT;
14         //$v不为‘’:存储缓存或者删除缓存
15         if($v !== ‘‘){
16             //删除缓存
17             if(is_null($v)){
18                 return @unlink($filename);
19             }
20             //存储缓存
21             $dir = dirname($filename);
22             if(!is_dir($dir)){
23                 mkdir($dir,0777);
24             }
25             $cacheTime = sprintf(‘%011d‘,$cacheTime);    //$cacheTime 设置为11位(方便截取),不满11位前面补0
26             //把缓存时间拼接$v
27             return file_put_contents($filename,$cacheTime.json_encode($v));
28         }
29         //读取缓存
30         if(!is_file($filename)){
31             return false;
32         }
33         $contents = file_get_contents($filename);
34         $cacheTime = (int)substr($contents,0,11);
35         $val = substr($contents,11);
36         if($cacheTime != 0 && $cacheTime+filemtime($filename) < time()){    //缓存已经失效
37             unlink($filename);
38             return false;
39         }
40         return json_decode($val,true);
41     }
42 }

参考:

PHP中的sprintf()函数的学习研究笔记

时间: 2024-10-17 07:50:09

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

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

方案一:读取数据库方式 从数据库读取信息→封装→生成接口数据 应用场景: 数据时效性比较高的系统 方案二:读取缓存方式 从数据库获取信息(第一次设置缓存或缓存失效时)→封装(第一次设置缓存或缓存失效时)→返回数据 ↓                                              ↑ 缓存(缓存生效时)     →   →    →    → 方案三:定时读取缓存方式(crontab 定时任务) 封装并返回数据 ↑ 数据库→crontab→缓存 ↑ http 请求 ==

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

从数据库中直接读取数据,虽然时效性很强,但是对数据库造成很大压力,尤其是在高访问量的情况下.这时候可以通过缓存,来有效的缓解了这一压力,虽然时效性有些不足,但是服务器的抗压能力却达到了很大的提高. 读取缓存方式的中心思想: 当请求进来时,先查看是否有缓存,如果有并且缓存还在有效时间内,不再查询数据库,直接返回缓存即可:如果没有或者已经过了有效时间,查询数据库,返回数据,同时生成一份新的缓存,供以后使用. 代码案例,还是在前几天的代码基础上进行改造完善. File静态缓存类    (原来的代码请参

ASP.Net开发基础温故知新学习笔记

申明:本文是学习2014版ASP.Net视频教程的学习笔记,仅供本人复习之用,也没有发布到博客园首页. 一.一般处理程序基础 (1)表单提交注意点: ①GET通过URL,POST通过报文体: ②需在HTML中为表单元素设置name: ③元素id是给Dom用的,name才是提交给服务器用的: (2)请求处理响应模型: ①浏览器发出访问请求→②服务器处理访问请求并返回HTML→③浏览器解析HTML并显示页面 (3)GET与POST的区别:(★★★→重点) ①GET通过URL传值,而POST通过HTT

《Spring3.X企业应用开发实战》学习笔记--DAO和事务

本篇是"<Spring3.X企业应用开发实战>,陈雄华 林开雄著,电子工业出版社,2012.2出版"的学习笔记的第二篇,关于DAO和事务. 本篇从DAO操作,以及事务处理的基本知识谈起,介绍事务本身,以及Spring如何通过注解实现事务. DAO 近几年持久化技术领域异常喧嚣,各种框架如雨后春笋般地冒出,Sun也连接不断的颁布了几个持久化规范. Spring对多个持久化技术提供了持久化支持,包括Hibernate,iBatis,JDO,JPA,TopLink,另外,还通过S

OpenCV(C++接口)学习笔记4-Mat::operator = 的陷阱

当我们想要将一个Mat对象的数据复制给另一个Mat对象时,应该怎么做呢? 我们发现,OpenCV提供了重载运算符Mat::operator = ,那么,是否按照下列语句就可以轻松完成对象的赋值呢? Mat a; Mat b = a; 答案是否定的! 我们可以从reference manual 中看到: Mat::operator = Provides matrix assignment operators. C++: Mat& Mat::operator=(const Mat& m) Pa

OpenCV(C++接口)学习笔记2-像素级的图像操作

1.通过成员函数at(int y, int x)访问 这种方法需要知道像素保存的格式. (1) 这是为模板类型的函数,因为一个函数的返回类型只有在运行时才会知道. (2)这个函数返回的是一个向量即Vector,故有下标的操作. image.at<uchar>(j,i)= 255; 在单通道图像中,采用以上语句可以获取图像(i,j)处的灰度值(注:先行后列,一般用j表示行(rows),i表示列(cols)).如果是灰度图像的话,只需要更改一个数据就可以了.如果是rgb图像的话,就要用"

Go语言学习笔记(一) : 搭建Windows下的Go开发环境

最近突然对Go语言产生了兴趣,主要是因为在使用python的时候遇到了一些不爽的问题,然后发现了Go.Go是Google出的一个动态语言,语法和C++接近,性能也非常的好,而且还支持编译成exe发布,并且不依赖任何虚拟机(其实是打包在exe里面了),这种好语言怎么能够错过?所以便一时兴起,开始学习了起来.由于本人还处于异常小白的阶段,所以文章中可能不免有些错误,欢迎大家各种指正. 安装Go 前往Go语言的官方网站:http://golang.org/, 下载对应平台的安装包.如果是x86的系统可

OpenCV(C++接口)学习笔记1-图像的读取、显示、保存

OpenCV在2.0版本之后添加了C++接口函数,之前学习的都是C语言的接口函数,现在OpenCV已经发展到2.4.9版本了,所以决定学习C++接口函数,跟上节奏. 1.创建图像 cv::Mat image; 采用类cv::Mat来定义图像变量或矩阵变量. 当然你也可以指定图像的大小: cv::Mat img(240,320,CV_8U,cv::Scalar(100)); 参数CV_8U中的U代表unsigned,而S代表signed.对于三通道彩色图像可以用CV_8UC3.你也可以声明16或3

蓝鸥Unity开发基础——类型转换学习笔记

蓝鸥Unity开发基础--类型转换学习笔记 类型转换包括:自动转换+强制转换 一.自动转换 自动转换:由系统自动完成,不会导致数据精度丢失,只能从低精度类型转换高精度类型. 二.强制转换 强制转换:从高精度转向低精度类型需要强制转换,会丢失精度,需要显式地进行转换. 源代码: using System; namespace Lesson07{    class MainClass    {        public static void Main (string[] args)