10.Smarty3:缓存控制

HTTP协议的无状态造成了对于每次页面的请求,都要重复地执行相同的操作,而不论数据是否被修改。但对于一些经常不变的信息,如果不想每次都重复执行相同的操作,就可以在第一次访问PHP应用程序时,将动态获取的HTML代码保存为静态页面,形成缓存文件。

1. 在smarty中控制缓存

smarty 缓存不同于smarty编译。smarty编译功能在默认情况下时启用的。而缓存则必须由开发人员显式开启。编译的过程将模版转换为PHP副本,虽然smarty模版在没被修改过的情况下,不会再重新执行转换过程,直接执行编译过的模版,但是这个编译过的模版是一个PHP脚本,只是减少了模版转换的开销。缓存则将PHP执行的脚本转换为静态页面。

1.1 建立缓存

<?php
    include 'libs/Smarty.class.php';
    $smarty = new Smarty;

    $smarty -> caching = true;  //启用缓存
    $smarty -> setCacheDir("./cache");  //指定缓存文件目录
    $smarty -> display('index.tpl');

在$cache_dir目录里的文件命名根模版一致,尽管是用.php作为扩展名,但是不会被当作php进行解析

1.2 处理缓存的声明周期

缓存页面的更新时间(以秒为单位),是通过Samrty对象中$cache_lifetime属性指定的,默认的缓存时间为3600s.

<?php
    include 'libs/Smarty.class.php';
    $smarty = new Smarty;

    $smarty -> caching = true;  //启用缓存
    $smarty -> setCacheDir("./cache");  //指定缓存文件目录
    $samrty -> cache_lifetime = 60*60*24*7; //设置缓存时间为1周
    $smarty -> display('index.tpl');

如果想给某些模版设定它们自己的缓存生存时间,可以在调用display()函数之前,通过设置$caching=2,然后设置$cache_lifetime为一个唯一值来实现。$caching必须因$cache_lifetime需要而设置伪true,值为-1时将永不过期。0(false)将导致缓存总是重新生成。

2. 每个模版多个缓存

如果开启缓存,则通过同一个模版生成的多个实例都需要被缓存。如果要多个缓存。则需要在调用display()方法时,通过在第二个可选参数中提供一个值,这个值时为每一个实例指定的一个唯一标识符,有几个不同的标志符就有几个缓存页面。

<?php
include 'libs/Smarty.class.php'
$smarty = new Samrty;

$smarty -> caching = 1; //启用缓存
$smarty -> setCacheDir("./cache");//设置缓存目录
$smarty -> cache_lifetime=60;
/* $news = $db -> getNews($_GET['newid']); //通过表单获取的新闻标题 $smarty -> assign('newsid',$news->getNewTitle()); //向模版中分配新闻标题 $smarty -> assign('newsdt',$news->getNewDataTime()); //向模版中分配新闻时间 $smarty -> assign('newsContent',$news->getNewContent()); //向模版中分配新闻主体内容 */

$smarty -> display('index.tpl',$_SERVER['REQUEST_URI']);    //将新闻ID作为第二个参数提供

因为每一个页面都有一个唯一的URI,所以使用$_SERVER["REQUEST_URI"]作为缓存ID比较合适。

3. 为每个实例消除处理开销

处理开销即为PHP脚本中动态获取数据和处理操作等的开销。如果启用的模版,缓存就要消除这些处理开销。如果禁用缓存,则这些开销总会发生。通过isCached()方法,判断指定的模版的缓存是否存在。

如果一个模版有多个实例,则可以使用isCached()方法中通过第二个可选参数指定缓存号。

<?php
include 'libs/Smarty.class.php'
$smarty = new Samrty;

$smarty -> caching = 1; //启用缓存
$smarty -> setCacheDir("./cache");//设置缓存目录
$smarty -> cache_lifetime=60;

//判断news.tpl的某个实例是否被缓存
if(!$smarty -> isCached('news.tpl',$_SERVER['REQUEST_URI'])){
/* $news = $db -> getNews($_GET['newid']); //通过表单获取的新闻标题 $smarty -> assign('newsid',$news->getNewTitle()); //向模版中分配新闻标题 $smarty -> assign('newsdt',$news->getNewDataTime()); //向模版中分配新闻时间 $smarty -> assign('newsContent',$news->getNewContent()); //向模版中分配新闻主体内容 */
}
$smarty -> display('index.tpl',$_SERVER['REQUEST_URI']);    //将新闻ID作为第二个参数提供

4. 清除缓存

缓存更新的过程就是先清除缓存,再重新创建一个缓存文件,可以用clearAllCache()来清除所有缓存,或者用clearCache()方法来清除单个缓存文件,同时可以指定第二个参数为要清除的具体缓存ID对应的缓存文件

$smarty->clearAllCache();   //清除所有缓存文件
$smarty->claearCache('index.tpl');//清除某一模版的缓存
$smarty->clearCache('index.tpl','CACHED');//清除某一模版的多个缓存中指定缓存号的一个

5. 关闭局部缓存

如果一个页面的部分区域不需要缓存。例如需要显示用户的登录名称的区域。明显不能为每一个用户都创建缓存。则需要在该部分局部关闭缓存。而该模版的其他部分仍开启缓存。

使用{nocache}...{/nocache}标签之间的内容将关闭缓存。另外也要在PHP脚本中,将动态分配给这个关闭缓存区域的动态内容,写在isCache()判断外。常应用于实时比分、广告、时间等地方。

你可能感兴趣的:(html,缓存,smarty,模版引擎)