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

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

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

php缓存静态页ThinkPHP之缓存技巧页面静态化动态缓存局部不缓存 jQuery

二、缓存的方法紧张要哪些?

静态缓存:缓存的是全体页面;

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

局部不缓存:利用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要求)