您的位置:首页 > 其它

smarty缓存机制

2016-06-08 10:47 169 查看
一、Smarty缓存的几种方式

缓存机制中,分为全局缓存、部分缓存、局部缓存三种方式,后面会一一讲述,下面是缓存设置前,Smarty类方法基本目录设置如下:

smarty−>Smarty();smarty->template_dir = ROOT.”/templates”;//模板目录smarty->compile_dir = ROOT.”/templatesc”;//编译目录smarty->cache_dir = ROOT.”/cache”;//缓存目录smarty->caching = true;//是否开启缓存,值为0,1,2,0则不开启:1则开启缓存:2则可设置特殊缓存,即在加载模板页前,对局部进行缓存时间的特殊设定,后面会讲到;可不写,默认为true-开启

smarty−>cachelifetime=“3600”;//缓存时间,可不写,默认为3600smarty->compile_check = true;//是否进行编译,可不写,默认为true

缓存机制中调用模板生成缓存页面,用的一个display()方法,将会在后文中用到,这里先讲解一下:

smarty−>display(stringtemplate[,stringcacheid[,stringcompileid]]);第一个必须参数:template,为需显示的模板;第二个可选参数:cacheid,可指定一个缓存号,此参数是给页面缓存添加一个标识的作用;第三个可选参数:compileid,可指定一个编译号,此参数是把一个模板编译成不同版本时使用,同样是起一个标识的作用,不常用。上面代码简洁、说明易懂吧!若引用创建Smarty类都不知,那下面可以省了,呵,开个玩笑!接着往下看。1、全局缓存方式定义:字面上看,意思很明了,就是为整个网站的全部页面都进行缓存生成,只要页面调用了Smarty类模板。代码实例:其实,在这段之前的基本目录设置中就讲到了,为说明,用蓝颜色标明了出来代码,只要在类中这样设置,并在页面中进行如下引用,页面即进行了缓存,smarty->display(‘index.tpl’);

而这条语句,有一个很大的缺陷,就是一个模板即一个模板页面,只生成一个缓存,而我们知道,大多网站的多数页面后面会接一些参数或不同页面调用同一个模板,比如:

http://blog.unvs.cn/archives/2012_9.html

http://blog.unvs.cn/archives/2012_8.html

http://blog.unvs.cn/archives/2012_7.html

比方这些是调用的同一个模板生成的页面,但是又必须生成3个缓存,使用上面的语句肯定做不到,这里我们要想到一开始讲到的第二个可选参数cache_id,用一个缓存号,来区分同一个模板生成不同的页面及缓存,代码实例:

cacheid=_GET[‘id’];//url中的id参数值

smarty−>display(‘index.tpl′,cache_id);//将缓存号加入,即可完成–同一模板–不同参数–不同缓存 的功能;

到这里,有人发现,如果我的页面不止一个参数,那是不是得全部解析出来并做为缓存号?这里有一个更好的方法,推荐给大家,也是网上大多赞同的。(其实,上面一段是’废话‘,可去掉,但为了循序渐进,更好理解而写的过渡,谅)

推荐的方法是:你可以直接将整个当前URL获取下来,作为cache_id加入缓存,这样无论它多少个参数,都不会存在同一个缓存页,

代码实例:

url=_SERVER[‘REQUEST_URI’];//获取当前页URL,有的将url进行md5加密,亦可

smarty−>display(‘index.tpl′,url);

2、部分缓存方式

定义:意思就是,网站系统的部分页面进行缓存,而一些页面不进行缓存,比方网站的注册、登录处理页面可不进行缓存。

一种处理方式:在display()方法前或后面,将此模板缓存进行一次清除操作,注意保持两者参数必须一致;

代码实例:

smarty−>clearcache(“index.tpl”);//此句放在display方法句前后都可以smarty->display(“index.tpl”);//与clear_cache方法参数必须一致

另一种处理方式:原理是一样的,因为部分缓存相当于两种情况,你可以另写一个display方法进行重构,其中一个参数判断是否进行缓存,若不,则进行clear_cache()方法处理,否则进行缓存;

代码实例:

function display(tempname,cache_id = null,iscache=true)if($iscache)$smarty−>clearcache(“index.tpl”,$cacheid);$smarty−>display(“index.tpl”,$cacheid);//此两句不解,见上面绿色代码else$smarty−>display(“index.tpl”,$cacheid);调用方法:self::display(temp_name, cacheid,false);//这样设置即不进行缓存,有任何疑问可留言提出。3、局部缓存方式定义:一个页面,一些地方不进行缓存,保持动态更新,每次都加载,比如文章详细页的浏览次数、登录窗口框等。有几种可实现局部缓存的方法(反面即处理好不缓存的地方就可实现局部缓存),着重讲解1、2种方法,我觉得就可以了,不用学会那么多。a、使用SMarty引擎中内置的nocache函数,实现不缓存功能(smarty3.1.8版支持,不知smarty2+是否支持)直接在tpl或html模板页中,不缓存区域加入nocache不缓存内容/nocache即可。代码实例:处理页面:smarty->assign(“time”,time());

模板页面:{nocache}<{time}>{/nocache}
b、注册块方法,实现不缓存
写一个no_cached方法,并调用smarty注册块函数将方法进行注册,即可实现,直接贴实例。
代码实例:
处理页面:smarty->assign(“time”,time());

function no_cached(param,content){//参数param为块参数数组,参数content为不缓存内容

return content;
}smarty->register_block("no_cached", “no_cached”, false);//注册块方法:register_block(tplfunc,reg_func, cacheable);//参数1为模板函数;参数2为需注册的函数即上面写的函数;参数3为是否进行缓存,这里必须设置为false模板页面:nocached<$time>/nocachedc、当然还有其他一些方法,比如:注册函数等,这里就不介绍了,其中注册块详细使用,请查看smarty说明书,这里就不详述了。4、缓存机制中的iscached用法最后,说下iscached(temp_tpl[, cacheid])判断是否已被缓存这个方法,temp_tpl参数为模板页,cacheid参数为缓存号,这个方法主要用在加载模板前进行缓存判断,若不存在就加载数据,若存在直接跳过,这样就达到了缓存的最终目的。示例:if(!smarty−>iscached(‘index.tpl′))//不存在缓存//调用数据库,并对变量进行赋值smarty->display(‘index.tpl’);//加载模板页
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  smarty 缓存机制