smarty缓存技术详解

缓存机制能能有效的减轻网站的服务器压力,Smarty模板引擎的一大亮点就是为我们提供了非常简单的缓存操作

首先我们要知道Smarty缓存机制分为全局缓存,部分缓存,局部缓存三种,我们一一介绍。

1、全局缓存

  顾名思义,全局缓存就是为整个网站的全部页面都生成缓存页面。

  首先我们要操作smarty的配置文件,开启缓存,指定缓存文件目录,并设置缓存的存活时间

  $smarty->cache_dir = ‘./cache/’; //设置存放缓存文件的文件夹

  $smarty->caching = 1;//开启缓存 0、FALSE代表关闭|非0数字、TRUE代表开启

  $smarty->cache_lifetime = 3600//单位为秒(如果填写-1为永不过期)

  接下来我们要去具体的php页面设置与之对应的具体缓存文件的名字

  $url=md5($_SERVER['REQUEST_URI']);//将当前页面的URL(包含?后面的所有参数)进行md5加密

  $smarty->display(‘list2.html’,$url);//设置缓存文件名

  需要注意的是:

  $smarty->display(‘与之对应的模板文件名’,'缓存文件名的补充部分’)这个方法。

  第二个参数不是必须的,如果不写的话,缓存文件名就是讲过加密处理的模板文件名。

  但是这样会碰到一个比较棘手的问题:

  http://localhost/1.10/sm/list2.php?lan=1

  http://localhost/1.10/sm/list2.php?lan=2

  http://localhost/1.10/sm/list2.php?lan=3

  3个URL对应应该的不同的内容,但是生成的缓存文件名都是list2.html加密后的结果。

  这就会导致用户想要查询的是不同的内容,访问的却是同一个缓存文件。

  所以建议加上一个辅助参数,将访问url(包含?后面的所有参数)md5加密是作者比较推荐的一种。

重点:使用缓存技术,很大一个原因就是为了减少对数据库的读写,所以我们要用$smarty->isCached('index.tpl')来判断缓存是否存在,如果存在了就不要再次操作数据库。

 

这里又有问题了,如果我改了数据库的某个内容,想更新显示内容,但是缓存又还没到消亡时间,那该肿么办呢?

$smarty->clearCache("index.tpl");

上面的clearCache可以解决这个问题,只要更新了数据后,调用clearCache清除一下缓存就可以了。

 

2、部分缓存

  首先了解什么叫部分缓存,其实就是指定一些文件生成缓存文件,而非网站的全部文件。

  了解了需要达到的效果,接下来我们就来具体操作

  操作之前,我们先要强调一个概念:

  部分缓存的实质其实是部分不缓存,也就是说不是指定那些文件生成缓存,而是指定具体一些文件不生成缓存

  假设有3个文件:

  1.php //需要缓存

  2.php //需要缓存

  3.php //不需要缓存

  在1.php/2.php文件中还是照旧写上$smarty->display(‘与之对应的模板文件名’,’缓存文件名的补充部分’)这个方法。

  但在3.php中我们要特别指明不需要生成缓存,具体的方法是:

  $smarty->clear_cache(‘与之对应的模板文件名’)//写在$smarty->display(‘与之对应的模板文件名’)之前还是之后都可以

  当然$smarty->display(‘与之对应的模板文件名’)还是要写,本来就不想生成缓存,第二个参数也就不需要了。

  $smarty->clear_cache()和$smarty->display()的参数一定要写成一致的

3、局部缓存

局部缓存 = 部分缓存, 就是一个页面的缓存中,并不是全都生成缓存,可以自定义设置某个功能模块不生成缓存,每次浏览都会更新数据;

例如:网页显示用户的状态、网页的统计数据、广告条等,这些数据的更新速度都非常快,不宜缓存,这样,局部缓存便有用武之地了。

局部缓存有3个方法:

一、insert法

insert 所包含的内容不会被缓存,每次调用该模板都会重新执行该函数.

使用方法:

注意这里的函数名一定要以insert开头,模板中的name与之对应。

index.php

//定义一个时间来测试insert与普通assign的差别
$date = date("Y-m-d H:i:s");
$smarty->assign("date", $date);
//insert
function insert_get_current_time($date){  
    return date("Y-m-d H:i:s");  
}

index.tpl

nocache:{insert name="get_current_time"}

cache: {$date}

然后看生成的缓存文件:得出结论 insert每次调用该模板都会重新执行该函数

nocache:echo insert_get_current_time(array (
),$_smarty_tpl);?>

cache: 2012-06-04 15:46:52

这种方法简单,但是如果要显示的内容是一大块的,就不宜使用了。

二、动态block 法

php中自定义块

index.php

//smarty 3
// function declaration
function smarty_block_nocache ($param,$content,$smarty)
{
  return $content;
}
 
// register with smarty
$smarty->registerPlugin("function","nocache", "smarty_block_nocache");

 

开始有提到过,Smarty3是用registerPlugin , Smarty2则是用register_block

index.tpl

{nocache}{$date}{/nocache}

然后看缓存文件 , 得出结论每次调用该模板都会重新执行$date

echo $_smarty_tpl->tpl_vars['date']->value;?>

三、插件block 法

这个方法和第2个差不多,只是把php中的自定义块,放到smarty目录中的plugins文件夹中。

在Smarty/plugins目录下建一个文件 block.nocache.php 内容如下:

php
function smarty_block_nocache($param, $content, $smarty)  
{  
      return $content;   
}  
?>

tpl模板中的使用和第二个方法一样

 

可以总结出Smarty缓存技术,能大大的提高网站的速度和质量,用法也比较简单。

最后提醒一下的就是, Smarty生成的缓存文件的扩展名虽然是php,但并不会被当作php代码来解析.

 

你可能感兴趣的:(PHP,smarty)