• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Smarty缓存机制实例详解【三种缓存方式】

    本文实例讲述了Smarty缓存机制。分享给大家供大家参考,具体如下:

    Smarty模板引擎中强大的缓存机制,缓存机制有效减少了系统对服务器的压力,而这也是很多开发者喜欢Smarty的原因之一,附录中讲解了设置缓存及清除缓存的技巧方法(其中包含缓存集合方法)。

    一、Smarty缓存的几种方式

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

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

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

    $smarty->display(string template[, string cache_id[, string compile_id]]);

    第一个必须参数:template,为需显示的模板;
    第二个可选参数:cache_id,可指定一个缓存号,此参数是给页面缓存添加一个标识的作用;
    第三个可选参数:compile_id,可指定一个编译号 ,此参数是把一个模板编译成不同版本时使用,同样是起一个标识的作用,不常用。

    上面代码简洁、说明易懂吧!若引用创建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,用一个缓存号,来区分同一个模板生成不同的页面及缓存,代码实例:

    $cache_id = $_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->clear_cache("index.tpl");//此句放在display方法句前后都可以
    $smarty->display("index.tpl");//与clear_cache方法参数必须一致
    
    

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

    代码实例:

    function display($temp_name, $cache_id = null,$is_cache = true){
    if($is_cache){
    $smarty->clear_cache("index.tpl", $cache_id);
    $smarty->display("index.tpl", $cache_id);//此两句不解,见上面绿色代码
    }else{
    $smarty->display("index.tpl", $cache_id);
    }}
    
    

    调用方法:

    self::display($temp_name, $cache_id, 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($tpl_func, $reg_func, $cacheable);//参数1为模板函数;参数2为需注册的函数即上面写的函数;参数3为是否进行缓存,这里必须设置为false
    
    

    模板页面:{no_cached}{$time}>{/no_cached}

    c、当然还有其他一些方法,比如:注册函数等,这里就不介绍了,其中注册块详细使用,请查看smarty说明书,这里就不详述了。

    4、缓存机制中的is_cached用法

    最后,说下is_cached($temp_tpl[, $cache_id])判断是否已被缓存这个方法,$temp_tpl参数为模板页,$cache_id参数为缓存号,这个方法主要用在加载模板前进行缓存判断,若不存在就加载数据,若存在直接跳过,这样就达到了缓存的最终目的。

    示例:

    if(!smarty->is_cached('index.tpl')){//不存在缓存
    //调用数据库,并对变量进行赋值
    }
    $smarty->display('index.tpl');//加载模板页
    
    

    以上为Smarty的三种缓存

    附:Smarty清除缓存方法

    一、普通清除缓存方法

    通过如下方法,对Smarty的缓存进行清除:

    代码示例:

    $smarty->clear_cache("index.tpl");//清除一个模板的缓存;
    $smarty->clear_cache("index.tpl", $cache_Id);//清除一个带缓存编号的缓存;如:页面http://www.abc.com/index.asp?act=login,可以将$cache_id设为login;
    $smarty->clear_all_cache();//清除所有缓存,即缓存目录下所有缓存文件;
    
    

    这样就存在一个问题,比方网站有一个栏目:http://blog.unvs.cn/archives/php/,我只想清除这一个栏目的页面缓存而不想全部清除或一个页面缓存,这种情况经常会碰到,那么,接下来会讲到Smarty引擎中强大的缓存集合方法。

    二、清除缓存集合方法

    Smarty中文教程是这样描述的:可以通过建立cache_id集合做更详细的集合体,在cache_id集合里用竖线"|"来分开子集合。可以尽可能多的包含子集合。

    上面解释的有点云里雾里,简单点说,就是在建立缓存中,将cache_id以一个带集合标识保存,用竖线隔开集合标识与缓存编号,而不仅仅是单一缓存编号,如:

    $smarty->display("index.tpl", "category|".$cache_id);
    //前面加了一个 category| 的前缀,表明将把缓存编号为$cache_id保存在category集合里,可以理解为分组;
    
    

    这里添加一个缓存文件如何命名知识点,缓存文件命名生成规则:集合名称^_Site目录_页面名称_参数_页面名称编码md5加密

    如下图所示:

    (category属于一个集合,index属于一个集合)

    刚将了集合的生成,下面关键如何清除集合下的缓存,方法如下:

    $smarty->clear_cache(null, "category");
    //注意模板文件参数为null,""都不可以。
    
    

    以上就完成了集合缓存的生成与清除,其实,网上也有这样一种方法:给一个栏目新建一个目录,比方news栏目,缓存生成放到一个news的缓存文件夹,这点不难,然后需要清除此栏目缓存时,缓存路径指向news即可。这个方法可行,个人觉得灵活性不高。

    好了,关于Smarty缓存机制原理的讲解就完成了,当然这些只是实际开发常用的应用技巧,还有更多与缓存相关的函数、块什么的,不过掌握这些,相信Smarty缓存就可以运用自如了。

    更多关于Smarty相关内容感兴趣的读者可查看本站专题:《smarty模板入门基础教程》、《PHP模板技术总结》、《PHP基于pdo操作数据库技巧总结》、《PHP运算与运算符用法总结》、《PHP网络编程技巧总结》、《PHP基本语法入门教程》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

    希望本文所述对大家基于smarty模板的PHP程序设计有所帮助。

    您可能感兴趣的文章:
    • Smarty模板引擎缓存机制详解
    • PHP模板引擎Smarty的缓存使用总结
    • Smarty局部缓存的几种方法简介
    • Smarty的配置与高级缓存技术分享
    • smarty 缓存控制前的页面静态化原理
    • php smarty模版引擎中的缓存应用
    • php smarty模版引擎中的缓存应用
    • smarty缓存用法分析
    • smarty模板局部缓存方法使用示例
    • PHP文件缓存smarty模板应用实例分析
    • Smarty高级应用之缓存操作技巧分析
    上一篇:PHP INT类型在内存中占字节详解
    下一篇:在 Laravel 项目中使用 webpack-encore的方法
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯

    时间:9:00-21:00 (节假日不休)

    地址:江苏信息产业基地11号楼四层

    《增值电信业务经营许可证》 苏B2-20120278

    Smarty缓存机制实例详解【三种缓存方式】 Smarty,缓存,机制,实例,详解,