php+redis实现全页缓存系统
php redis 实现全页缓存系统
之前的一个项目说的一个功能,需要在后台预先存入某个页面信息放到数据库,比如app的注册协议,用户协议,这种.然后在写成一个php页面,app在调用接口的时候访问这个页面.当时我就发现一个问题,这些协议往往几个月才会修改一次,而每一次用户查看这些协议的时候,nginx都会重新从数据库读取文件,速度会很慢慢了.
如下图m_about.php是我生成的数据页,
其次是几个借鉴cache系统的函数,remember函数,记忆缓存,这个是对外的最重要的接口,一般在缓存系统里面直接使用它就好./**
* 记录对应的缓存,如果之前存在则返回原本的缓存
* @param string $cacheName 缓存名
* @param string | callback $urlOrCallback 需要缓存的数据地址.可以是一个 网页地址也一个可回调类型,如果不是可回调类型,则判定是一个网址
* @param null | int $ttl 缓存过期时间,如果不过期就是用默认值null
* @throws \Exception 如果无法访问地址
* @return boolean|string 缓存成功返回获取到的页面地址
*/
public function remember($cacheName, $urlOrCallback, $ttl = null)
{
$value = $this->get($cacheName);//检查缓存是否存在
if (!$value) {
//之前没有使用键
if (is_callable($urlOrCallback)) {
$text = $urlOrCallback();
} else {
//如果不是回调类型,则尝试读取网址
$text = $this->getUrlText($urlOrCallback);
}
if (empty($text)) {
throw new \Exception('can not get value:' . $urlOrCallback);
}
$this->put($cacheName, $text, $ttl);
return $text;
} else {
return $value;
}
}
refresh函数,刷新缓存函数,如果缓存页面被更新了,就去刷新它./**
* 更新缓存,并返回当前的缓存
* @param string $cacheName 缓存名
* @param string | callback $urlOrCallback 需要缓存的数据地址.可以是一个 网页地址也一个可回调类型,如果不是可回调类型,则判定是一个网址
* @param null | int $ttl 过期时间,如果不过期就是用默认值null
* @return boolean|string 缓存成功返回获取到的页面地址
*/
public function refresh($cacheName, $urlOrCallback, $ttl = null)
{
$this->delete($cacheName);
return $this->remember($cacheName, $urlOrCallback, $ttl);
}
剩下的两个代码文件.一个是redisFPC.php,这是全页缓存的demo,一个是测试用的文件
fpcTest.php
这里是用的是github,连接到我本人的git博客上面.如果连接github有问题,可以看本文最后给的完整代码.
测试
我们在这里测试,第一次加载因为需要读取对应的m_ahout的信息,所以慢一点
测试用的test代码
注意这里的url写的是本地的缓存url<?php
use RedisFPC\RedisFPC;
require_once 'redisFPC.php';
/* $text = file_get_contents('http://localhost:1002/m_about.php');
var_dump($text); */
$url = 'http://localhost:1002/m_about.php';
$fpc = new RedisFPC();
echo $fpc->remember('服务协议', $url, 60*60*24);