smarty(模板引擎,模板技术)

使用smarty主要是为了实现逻辑和外在内容的分离;

特点:

1、速度快(因为第二次执行的时候使用第一次执行时生成的编译文件)

2、缓存技术(正是因为缓存技术,使得smarty模板技术不太适合那些对于实时性更新要求比较高的,比如股票信息)

3、插件技术

4、缓存技术

5、语句自由静态页面技术实际上是以空间换时间的技术:

http://localhost/news.php?id=8比如这个是某门户网站的新闻页面,

很多人访问,每次都要去数据库里查询,可以再第一次访问的时候生成一个html页面,以后的访问者都是访问这个静态页面)

数据库—>静态页面

分析模板技术:是利用php语言读取模板文件完成字符串替换掉的过程

详解代码如下:

html页面:
<body>
<font color = 'red'>{id}</font><br>
<font color = 'green'>{name}</font><br>
<font color = 'bule'>{age}</font><br>
</body> 后台逻辑部分
//
$id=8;
$name='zhangsan';
$age = 12; $str = file_get_contents('demo1.html');//模板文件的所有内容
$str = str_replace('{id}', $id, $str);//替换id
$str = str_replace('{name}', $name, $str);
$str = str_replace('{age}', $age, $str);
echo $str;
?>

面向对象技术实现模板功能的封装

<?php
class Template
{
//属性
public $vars; //保存要替换的标记和数据的内容
public $left_delimiter = '{*'; //左分隔符
public $right_delimiter = '*}'; //右分隔符
//方法
public function assign($key,$value)
{ $this->vars[$key] = $value;
}
public function display($file) //file表示模板名
{
$str = file_get_contents($file); //从模板中读取多有内容,并将内容放入$str中
foreach ($this->vars as $key => $value) //$key 键名(模板标记) $value 值
{
$str = str_replace($this->left_delimiter.$key.$this->right_delimiter, $value, $str);
}
echo $str;
//file_put_contents('bak.html', $str);
}
}
?>

注意:assign(‘name’,’zhangsan’);这句的时候其实还没有进行数据替换,而是把传入的数据保存在vars[]中,当display的时候才进行数据替换

smarty的处理过程:

1、 smarty将php源文件,首先编译成中间文件

2、 如果启用缓存,再根据编译文件生成缓存文件

3、 之后每次访问都会访问编译文件

如果启用缓存文件而且有缓存文件并且缓存文件没有过期,则直接访问缓存文件

(先不考虑缓存的时候的流程)

编译文件里时间戳记录模板文件修改时间,如果模板被修改过就可以检测到,然后重新编译

(编译是把静态内容保存起来,动态内容根据传入的参数不同而不同)

读取编译文件省去了读取模板文件,和字符串替换的时间,所以可以更快

第一次请求demo.php时候编译,产生编译文件,在编译文件里

第二次请求demo.php的时候,判断模板文件是否改变,如果模板文件已改变,那么去读取模板文件,然后再编译,如果没有改变,则去读取编译文件,编译文件最终输出;

缓存默认是关闭的;缓存是把数据彻底的存在缓存文件里,直到缓存文件过期才会重新来缓存;所以说smarty在一些实时性特别强的网站里不是特别合适;

考虑缓存:

在smarty程序里,判断是否开启了缓存文件,并且缓存文件没有过期,,就去找缓存文件

如果没有开启缓存文件,就去判断模板文件,如果缓存文件已过期,也是去判断模板文件。

最新文章

  1. 9.1.2 asp.net core 自动生成组合查询
  2. WPF中运行时使内容可以上下左右被鼠标拖动应该怎么做?
  3. java web学习总结(十五) -------------------JSP基础语法
  4. Let &amp; Const
  5. UVM的类库
  6. EventBus简单的实现
  7. VelocityTracker简介
  8. Java 死锁诊断 -- 线程转储
  9. 用yum源安装Nginx
  10. [转] Gvim for windows中块选择的方法
  11. vbs和qtp一些脚本
  12. oracle删除数据后表空间仍过大问题解决方法
  13. 201521123077 《Java程序设计》第10周学习总结
  14. 如何在CentOS上安装一个2048小游戏
  15. 在eclipse的配置文件里指定jdk路径
  16. [LeetCode] Largest Plus Sign 最大的加型符号
  17. python标准日志模块logging及日志系统设计
  18. iOS项目之获取WebView的高度
  19. SQL JOIN语法,以及JOIN where 和and区别,还有where和join效率问题。
  20. socket 总结

热门文章

  1. 美国在线CEO:雅虎被Verizon收购或导致裁员
  2. Spring源码学习——自定义标签
  3. 数据库SQL语言从入门到精通--Part 1--SQL语言概述
  4. 数学--博弈论--巴什博奕(Bash Game)
  5. CodeForces - 260C
  6. .Net Core中使用Dapper构建泛型仓储
  7. HDU1214圆桌会议
  8. F. Cards and Joy
  9. 大富翁 线段树+二分 +dfs
  10. (3).mybatis编写工具类