Smarty缓存

非常有用,非常重要。

  

什么是缓存?

所谓缓存,就是将经常会用到的数据,保存到硬件或软件中。但归根结底都是保存在内存中。

下次再访问的时候,可以直接从缓存中读取数据,从而提高访问效率。

比如浏览器缓存、CPU的L2等。

  

缓存方式:

ü  数据缓存

ü  文件缓存

  

数据缓存

站在数据库(比如mysql)的角度,对于一些经常要用到不变化的数据,可以将其缓存起来,那么后续的访问,就可以直接访问该缓存内容,无需连接数据库,查询表。从而极大的提高了访问效率。比如memcached。

  

文件缓存

站在php的角度,有时候也称之为页面缓存,将不经常变化的页面(且访问量比较大),可以将其保存为静态页面,下次访问的时候,直接访问该静态页面,无需通过php了。从而提高访问速度,如各大新闻网站,博客网站。比如页面静态化技术。

  

  

请问:Smarty是哪一种?---文件缓存。

  

1.使用缓存

在项目中,使用缓存。

  

默认情况下是,smarty是没有开启缓存。

需要设置,开启缓存,有如下几个配置项:

ü  开启缓存,caching

ü  缓存目录,cache_dir

ü  缓存有效期,cache_lifetime,单位是s,默认值3600,一个小时

  

在基础控制器,开启缓存,如下:

  

Smarty缓存_缓存

 

 <?php

//1.引入smart的类

require './libs/Smarty.class.php';

//2.实例化smarty的对象

$smarty = new Smarty;

//3.设置相关属性

//$smarty->force_compile = true;//强行编译

$smarty->debugging = true;//调试模式开启

$smarty->caching = true;//cache缓存

$smarty->cache_lifetime = 120;//cache的周期

$smarty->template_dir="./templates";//设置模板目录

$smarty->compile_dir="./templates_c";//设置相关的编译后的目录

 

//开启缓存

$smarty->caching=true;

//设置缓存目录

$smarty->cache_dir='cache';

//设置有效期

$smarty->cache_lifetime=60;

//开启smarty调试模式

$smarty->debugging=true;

 

 

//4.分配数据

$smarty->assign('title',"这个是标题");

$smarty->assign('content',"这个是内容");

//5.指定输出的模板文件./templates/index.html

 

$smarty->display('index.html');

 

其中,需要在目录之下,新建一个cache目录,如下;

  

  

此处,用到了调试模板,如下:

  

Smarty缓存_缓存_02

  

访问首页,

  

Smarty缓存_缓存_03

  

 

  

查看缓存文件,如下:

  

Smarty缓存_缓存_04

  

有缓存的,但是没有利用缓存。

 

需要有一个机制,来判断缓存是否有效。如果有效,则无需使用模型获取数据。

  

Smarty提供了一个isCached()方法用于判断缓存的页面是否有效。

  

Smarty缓存_缓存_05

 

Smarty缓存_缓存_06

  

对比7:1 (由于数据量过小 不是很明显 )

  

但是还是极大的提升了访问效率。

  

  

 

  

2.局部不缓存

页面一旦缓存,所有的内容都是静态的,但实际上,有些内容是不能使用静态的,比如用户状态,时间显示等。

Smarty为我们提供了局部不缓存。

  

smarty 提供了三种方式,来实现局部不缓存

  标签的缓存控制,即在标签中使用 nocache 属性,适用于单个标签

  变量的缓存控制,即在分配变量时设置第三个参数为 true,适用于单个变量

  模板区域缓存控制,即在模板页面中使用{nocache} {/nocache},适用于一块

  

  

第一种方式

直接在模板页面中对某个变量,加上nocache属性即可

  

Smarty缓存_缓存_07

第二种方式

在php程序,使用assign函数的第三个参数,设置true即可。

  

Smarty缓存_缓存_08

  

第三种方式

在模板页面中,使用nocache内置函数,可以控制器一块区域不缓存

  

Smarty缓存_缓存_09

  

请问:局部不缓存的本质是什么?

查看缓存文件,

  

Smarty缓存_缓存_10

  

缓存文件本身是php文件,因为它要处理局部不缓存的情况。

  

而且,对于一个缓存文件的有效期的判断,是通过在改文件中保存一些信息来实现的,所以必须以php的方式来保存缓存文件,这也就是缓存的名字为什么是php的原因的了

  

Smarty缓存_缓存_11

  

  

☞注意细节

  局部不缓存的本质,还是动态的访问程序,可以查看缓存页面来验证。

  变量不缓存的设置,会在编译后的代码中起效。所以如果你重新设置了某个变量不缓存,那么你需要删除已经存在的编译和缓存文件,使得模板可以重新编译并起效。

  

  

3.单模板多缓存

[需求]:对商品详情页面进行缓存

  

编写indexAction如下:

  

Smarty缓存_缓存_12

  

访问第一个页面,如下:

  

Smarty缓存_缓存_13

  

访问第二个,如下:

Smarty缓存_缓存_14

  

还是这个内容,why?

原因很简单,因为所有的商品都是相同的模板页面,

  

Smarty缓存_缓存_15

  

  

只要该缓存有效,每次访问的时候,都会直接使用它。

但实际上不同的商品,内容是不同的。应该缓存为不同的内容才可以。

  

Smarty为我们提供了单模板多缓存的机制。

  

使用,在display的时候,增加一个参数,唯一标识这个商品。

然后在判断的时候,isCahced中也可以增加一个参数,指定是哪个商品的缓存是否有效。

  

编写代码如下:

  

Smarty缓存_缓存_16

  

生成缓存文件如下:

  

Smarty缓存_缓存_17

  

4.缓存组

[需求]:对商品列表页进行缓存。

  

  

  

Smarty缓存_缓存_18

  

如果要缓存,缓存的页面数大概为:10 * 10 * 5 * 7 = 3500

还有分页,均值为4, 4 * 3500 = 14000

是否值得?

空间、时间。

  

空间换时间。

  

具体如何来实现呢?

  

index.php?p=home&c=list&a=index&size=m&brand=puma&style=long&material=cutton

  

编写代码如下:

  

Smarty缓存_缓存_19

  

然后使用不同的组合来访问,生成的缓存文件如下:

  

Smarty缓存_缓存_20

  

其实,缓存组的本质仍然是单模板多缓存。

  

  

  

  

  

5.删除缓存

缓存什么时候会失效?

  

有效期过了

  模板页面发生了变化

  删除缓存文件

  

比如在大多数后台中,都会提供清除缓存的操作。

  

  

Smarty提供了两个方法,

  clearCache(),删除指定页面的缓存

  clearAllCache(),删除所有的缓存

 $smarty->clearAllCache();

  

  

删除文件底层是使用unlink()函数。