Skip to main content
 Web开发网 » 站长学院 » Thinkphp教程

ThinkPHP之缓存技术(页面静态化、动态缓存、局部不缓存)

2021年11月14日6240百度已收录

一、为何要使用缓存技术?

作用:对于一个日访问量达到百万级的门户网站,速度快慢很大程度上决定了网站的收入。除了优化网站内容显示策略外,提升网站速度最好的方法便是“静态缓存/动态缓存”技术。

静态缓存:动态页面转换成静态页面,速度将提升2至10倍,如:文件缓存技术(传统手段);如果静态页面能够缓存到内存里,速度将提升2至3个数量级,如:memcache缓存技术(流行);

动态缓存:即,局部缓存,进将不需要实时更新的数据缓存,并不是整个页面;

二、缓存的方法主要要哪些?

静态缓存:缓存的是整个页面;

动态缓存:缓存的是页面的局部,即,局部缓存;

局部不缓存:利用js、Ajax(异步)实现缓存页面的局部不缓存

三、基于ThinkPHP的缓存实现

(1)静态缓存、动态缓存、局部不缓存的含义/用途

静态缓存:生成静态页面——缓存的是整个页面;

动态缓存:仅对数据库中的数据进行了缓存,即“通过动态缓存,不需要再读取数据库了,直接通过缓存文件来调取相应数据”;

局部不缓存:实现缓存页面中某一部分不缓存,如:登录/退出、点击量;

(2)静态缓存的实现,在config.php文件中作如下配置:

//开启静态缓存(默认保存在Html/文件夹中)

'HTML_CACHE_ON'=>true,

'HTML_CACHE_RULES'=> array(

//'*'=>array('{$_SERVER.REQUEST_URI|md5}','30'), //根据当前的URL进行缓存

* …更多操作的静态规则

* '控制器名/方法名' => array('缓存文件的名称','静态缓存有效期','附加规则'),

* {:module}:控制器名

* {:action}:方法名

* {id}:get参数值

'Show:index'=>array('{:module}_{:action}_{id}',0),//0:永久有效

(3)动态缓存的实现:两种方式(文件缓存、memecache缓存)

1、文件缓存(默认方式)

ThinkPHP的S()函数将“从数据库中获得的数据”缓存到“文件”中;

缓存文件默认保存到“Runtime/Temp/”文件夹中;

存数据格式:S('缓存名称','缓存数据','缓存时间');

存数据:S('index_list',$list,10); // $list:从数据库中读取的数据

读数据:S('index_list'); // 直接从缓存文件读取,不再经过数据库

2、memecache缓存

第一步:安装Memcached

第二步:memecache缓存配置(在config.php文件中作如下配置:)

//开启动态缓存(memecache缓存)

'DATA_CACHE_TYPE'=>'Memcache',//缓存类型

'MEMCACHE_HOST'=>'localhost',//本地服务器地址

'MEMCACHE_PORT'=>11211,//默认端口

'DATA_CACHE_TIME'=>3600,//全局缓存时间:特别注意这里不要加引号,否则将不起作用!!!

第三步:通过S()函数实现“动态缓存”

ThinkPHP的S()函数将“从数据库中获得的数据”缓存到“内存”中;

存数据:S('index_list',$list,10);

读数据:S('index_list')

3、redis缓存

第一步:安装redis及php-redis拓展

详见另外两篇文章

第二步:redis缓存配置

//动态缓存配置:

'DATA_CACHE_TIME'=>3600,

//开启动态缓存(Redis缓存)

'DATA_CACHE_TYPE'=>'Redis',

'REDIS_HOST'=>'127.0.0.1',

'REDIS_PORT'=>6379,//默认端口

第三步:通过cache()函数实现“动态缓存”

1 缓存初始化

cache(array('type'=>'xcache','expire'=>60));

2 缓存设置

cache('a',$value);

3 缓存读取

$value = cache('a');

4 缓存删除

cache('a',null);

拓展:使用查询缓存方式实现动态缓存

对于及时性要求不高的数据查询,我们可以使用查询缓存功能来提高性能,而且无需自己使用缓存方法进行缓存和获取。

新版内置的查询缓存功能支持所有的数据库,并且支持所有的缓存方式和有效期。

在使用查询缓存的时候,只需要调用Model类的cache方法,例如:

$Model->cache(true)->select();

如果使用了cache(true) ,则在查询的同时会根据当前的查询SQL生成查询缓存,默认情况下缓存方式采用DATA_CACHE_TYPE 参数设置的缓存方式(系统默认值为File表示采用文件方式缓存),缓存有效期是DATA_CACHE_TIME 参数设置的时间,也可以单独制定查询缓存的缓存方式和有效期:

$Model->cache(true,60,'xcache')->select();

表示当前查询缓存的缓存方式为xcache,并且缓存有效期为60秒。

同样的查询,如果没有使用cache方法,则不会获取或者生成任何缓存,即便是之前调用过Cache方法。

查询缓存只是供内部调用,如果希望查询缓存开放给其他程序调用,可以指定查询缓存的Key,例如:

$Model->cache('cache_name',60)->select();

则可以在外部通过S方法直接获取查询缓存的内容,

$value = S('cache_name');

除了select方法之外,查询缓存还支持find和getField方法,以及他们的衍生方法(包括统计查询和动态查询方法)。具体应用的时候可以根据需要选择缓存方式和缓存有效期。

(4)动态缓存应用实例

public function index(){

if(!$list=S('index_list')){

//echo 111;//测试是否进行了动态缓存

$list=M('cate')->where(array('pid'=>0))->order('sort')->select();

S('index_list',$list,10);

$this->cate=$list;

$this->display();

(5)局部不缓存的实现:两种方式(JavaScript、异步)

1、JavaScript

前台模板:

<span>点击量<script src="{:U('Show/hitsCount',array('id'=>$blog['id']))}"></script>次</span>

后台控制器:

public function hitsCount(){

$id=I('id');

//点击次数:每次打开博文后点击次数+1

//(当然也可以设置一个IP地址只能增加一次:记录用户的IP就显得很重要了)

$where=array('id'=>$id);

$hits=M('blog')->where($where)->getField('hits');

M('blog')->where($where)->setInc('hits');//如果增2:setInc('hits',2)

echo 'document.write('.$hits.')';//这一步很关键:获得的数据赋值给前台静态缓存页面

2、异步

详见本教程中的文章:异步操作(Ajax请求)

评论列表暂无评论
发表评论
微信