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()判断外。常应用于实时比分、广告、时间等地方。