一.Smarty模板引擎的继承
继承带来了模板面向对象的概念(oop),它允许你定义一个或者多个基模板供子模板继承
继承意味着子模板可覆盖所有或部分父模板中命名相同的块区域
继承树大小没有规定,只要你愿意你想搞多大都可以,但需要注意所有文件都必须在运行
时检查修改设置,更多的继承意味着更大的开销
子模板通过{extends}标签定义继承父模板,该定义应写在子模板的第一行
子模板不能定义任何内容,除了需要覆盖父模板的{block}标签块,所有的{block}标签
外的内容将被自动移除
使用{extends}函数实现模板继承:
{extends可以复制父类的内容 而子类文件中用这个函数找一下它爹就行了}
在子模板中覆盖父模板中的部分内容区域
合并子模板和父模板的{block}标签内容
二.使用{extends}函数实现模板继承
1.子模板要想继承父模板内容,在子模板中写{extends file='父模板路径'}
孙模板想要继承子模板和父模板内容,就在孙模板中写{extends file='子模板内容'}
上面的在php中也可以这么写
$smarty->display(‘extends:parent.tpl|child.tpl|grandchild.tpl ’);
2.如果子模板继承了父模板,而子模板想在父模板的基础上进行修改可以使用{block}{/block}
标签,在这个标签中所写的内容就会跟父模板中的内容有所不一样
例:
父模板
{block name='content'}
内容
{/block}
子模板
{block name='content'}
内容
在子模板进行修改的时候,{block}中的名字一定要跟父模板里的名字一致
3.如果子模板继承了父模板{block}中的内容,在父模板基础上的内容从后面追加一些内容
要使用append关键字
例:
{block name="content1" append}
我是在后面追加的内容
{/block}
如果子模板想在父模板基础上前面追加一些内容,就使用prepend关键字
例:
{block name="content2" prepend}
我是在前面追加的内容
{/block}
如果子模板想在父模板基础上从父模板内容中间追加一些内容,要在父模板内容要追加的位置
写上{$smarty.block.child} 然后再子模板中使用{block}直接插入就行
例:
父模板
{block name="content3"}
我是父模{$smarty.block.child}板内容
{/block}
子模板
{block name="content3"}
我在内容中间插入内容
{/block}
或
如果子模板想在父模板基础上从父模板内容中间追加一些内容,也可以要在子模板内容要追加的位置
写上{$smarty.block.parent}
父模板
{block name="content4"}
我是父模板内容
{/block}
子模板
{block name="content4"}
我是追加内容 {$smarty.block.parent}
{/block}
三.静态缓存/页面静态化
动态网页的瓶颈
数据库压力(储存大,连接多,查询多)
解决方法
若页面数据更新不频繁,可采用静态文件,使其定时读取数据库的内容
1.output buffer 输出缓冲
PHP程序有三个缓存区:ob缓存,程序缓存,浏览器缓存
输出缓存是内存空间的一部分,也就是说,在内存空间中预留的空间就叫做缓冲区
常用PHP操作:
ob_start(); 开启ob缓存,将输出数据都存储在内存缓冲区
ob_get_contents(); 获取ob缓存的内容,以字符串形式返回
ob_flush(); 输出缓冲区中的内容
ob_end_clean(); 清空并关闭ob缓存
例:
//自定义生成静态页面练习
$id=$_GET['id'];
//为了判断每次查的商品不一样 而且生成的页面对应不同的商品,
//在生成文件的时候在文件拼上id号这样可以防止生成相同页面
$static_file=ROOT."/cache/detail".$id.".html";
//判断静态文件目录中有没有需要的静态文件,还要判断该静态文件用没有过期,
//文件修改时间加上存活时间小于现在的时间说明他过期了
//设置静态文件的存活时间
$lifetime=10;
if(!file_exists($static_file) || filemtime($static_file)+$lifetime
try{
//先用PDO new出来一个数据库对象
$pdo=new PDO("mysql:host=127.0.0.1;port=3306;dbname=yhshop","root","123456",array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION));
//设置汉字编码
$pdo->exec("set names utf8");
//查找 数据库中的内容
$statement=$pdo->query("select * from yh_goods where id=$id limit 1");
//把查询出来的结果写进变量
$goods=$statement->fetch(PDO::FETCH_ASSOC);
//测试没有静态页面是否查数据库
echo "";
echo "我是从数据库查出来的东西";
print_r($goods);
//把查到的数据分配给模板
$smarty->assign("goods",$goods);
//开启ob缓冲
ob_start();
//显示页面
$smarty->display("detail.html");
//从缓冲区读取生成的静态页面内容返回一个字符串
$str=ob_get_contents();
//将生成的静态内容写入静态文件中
file_put_contents($static_file,$str);
//输出缓冲区中的内容
ob_flush();
//清除并关闭缓冲
ob_end_clean();
}catch (PDOException $e){
echo $e->getMessage();
}
}else{
//静态页面如果存在直接输出
//判断是否是静态页面
echo "静态化页面";
include_once $static_file;
}
四.使用Smarty来缓存控制实现页面静态化
在Smarty中控制缓存
每个模板多个缓存
为缓存实例消除处理开销
清除缓存
关闭局部缓存
1.建立缓存
如果需要使用缓存,首先要做的就是让缓存可用,这就是设置Smarty对象中的缓存属性
例:
include "libs/Smarty.class.php";
$smarty = new Smarty;
$smarty -> caching = true; //启用缓存
$smarty -> setCacheDir("./cache"); //指定缓存文件保存的目录
$smarty -> display('index.tpl'); //也会把输出保存
2.处理缓存的生命周期
如果被缓存的页面永远都不更新,就会失去动态数据更新的效果,我们可用通过指定一个更新时间
让缓存的页面在指定的时间内更新一次
例:
include "libs/Smarty.class.php";
$smarty = new Smarty;
$smarty -> caching = true; //启用缓存,在获取模板之前设置缓存生存时间
$smarty -> setCacheDir("./cache"); //指定缓存文件保存的目录
$smarty -> cache_lifetime = 60*60*24*7; //设置缓存时间为1周
$smarty -> display('index.tpl'); //也会把输出保存
3.为缓存实例消除处理开销
所谓的处理开销,是指在PHP脚本中动态获取数据和处理操作等的开销,如果启用了模板,缓存就要消除这
些处理开销
如果同一个模板有多个缓存实例,每个实例都要消除访问数据库和操作处理的开销,
可以在isCached( )方法中通过第二个可选参数指定缓存号
isCached()判断缓存是否存在
isCached和display两个方法所用参数是相同的,都是对同一模板中的特定实例进行操作。
例:
include "libs/Smarty.class.php";
$smarty = new Smarty;
$smarty -> caching = 1; //启用缓存
$smarty -> setCacheDir("./cache"); //指定缓存文件保存的目录
$smarty -> cache_lifetime = 60*60*24*7; //设置缓存时间为1周
//判断news.tpl的某个实例是否被缓存 $_SERVER缓存ID防止生成同一个文件
$_SERVER拿全局变量中一些信息配置REQUEST_URI是url地址中传的ID
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.每个模板多个缓存
同一个模板生成的多个实例都需要被缓存
例:
include "libs/Smarty.class.php";
$smarty = new Smarty;
$smarty -> caching = 1;
//启用缓存
$smarty -> setCacheDir("./cache");
//指定缓存文件保存的目录
$smarty -> cache_lifetime = 60*60*24*7;
//设置缓存时间为1周
/*
$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作为第二个参数提供
5.关闭局部缓存
在Smarty3中提供了一个新的内置标签{nocache},是一个快函数。在模板中将所有不需要缓存的区域放置在
{nocache}…{/nocache}之间,即关闭了缓存。另外,也要在PHP脚本中,将动态分配给这个关闭缓存区域的动态内容,
写在isCache()判断之外。以后只要在模板定义中,对于不需要缓存的部分,例如,实时比分、广告、时间等,
使用{nocache}和{/nocache}关闭缓存的内容即可
6.清除缓存
页面在缓存时间内输出结果是不变的,我们需要更新内容的同时也更新缓存,缓存的更新过程就是先清除缓存,
再重新创建一次缓存文件。
使用Smarty对象中的clearAllCache()方法来清除所有缓存,或用clearCache()方法来清除单个缓存文件。
使用clearCache()方法不仅清除指定模板的缓存,如果这个模板有多个缓存,
你也可以使用第二个参数指定要清除具体缓存ID对应的缓存文件
例:
$smarty -> clearAllCache ( );
//清除所有的缓存文件
$smarty -> clearCache(“index.tpl”);
//清除某一模板的缓存
只要做数据库里的更新所有的静态页面和缓存里的数据都要进行清除和更新
$smarty -> clearCache (“index.tpl”,”CACHEID”); //清除某一模板的多个缓存中指定一个缓存号的