smarty(原理概述)
转自:http://www.cnblogs.com/RightDear/archive/2012/11/06/2756218.html
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;
?>

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

1 <?php
2 class Template
3 {
4 //属性
5 public $vars; //保存要替换的标记和数据的内容
6 public $left_delimiter = '{*'; //左分隔符
7 public $right_delimiter = '*}'; //右分隔符
8 //方法
9 public function assign($key,$value)
10 {
11
12 $this->vars[$key] = $value;
13 }
14 public function display($file) //file表示模板名
15 {
16 $str = file_get_contents($file); //从模板中读取多有内容,并将内容放入$str中
17 foreach ($this->vars as $key => $value) //$key 键名(模板标记) $value 值
18 {
19 $str = str_replace($this->left_delimiter.$key.$this->right_delimiter, $value, $str);
20 }
21 echo $str;
22 //file_put_contents('bak.html', $str);
23 }
24 }
25 ?>

注意:assign(‘name’,’zhangsan’);这句的时候其实还没有进行数据替换,而是把传入的数据保存在vars[]中,当display的时候才进行数据替换
smarty的处理过程:
1、 smarty将php源文件,首先编译成中间文件
2、 如果启用缓存,再根据编译文件生成缓存文件
3、 之后每次访问都会访问编译文件
如果启用缓存文件而且有缓存文件并且缓存文件没有过期,则直接访问缓存文件
(先不考虑缓存的时候的流程)
编译文件里时间戳记录模板文件修改时间,如果模板被修改过就可以检测到,然后重新编译
(编译是把静态内容保存起来,动态内容根据传入的参数不同而不同)
读取编译文件省去了读取模板文件,和字符串替换的时间,所以可以更快
第一次请求demo.php时候编译,产生编译文件,在编译文件里
第二次请求demo.php的时候,判断模板文件是否改变,如果模板文件已改变,那么去读取模板文件,然后再编译,如果没有改变,则去读取编译文件,编译文件最终输出;
缓存默认是关闭的;缓存是把数据彻底的存在缓存文件里,直到缓存文件过期才会重新来缓存;所以说smarty在一些实时性特别强的网站里不是特别合适;

考虑缓存:
在smarty程序里,判断是否开启了缓存文件,并且缓存文件没有过期,,就去找缓存文件
如果没有开启缓存文件,就去判断模板文件,如果缓存文件已过期,也是去判断模板文件。
smarty(原理概述)的更多相关文章
- linux软中断与硬中断实现原理概述
linux软中断与硬中断实现原理概述. 1.软中断通过open_softirq注册一个软中断处理函数,即在软中断向量表softirq_vec数组中添加新的软中断处理action函数. 2.调用rais ...
- InspectIT_EUM 实现原理概述
在Git上查看 InspectIT 实现原理概述: 实现原理详解: 1.jsAgent如何注入到浏览器 通过ASM框架修改HttpService.service()方法,加入相关逻辑,对每一个Htt ...
- PHP的模板引擎smarty原理是什么(整理)
PHP的模板引擎smarty原理是什么(整理) 一.总结 一句话总结:其实所有的模板引擎的工作原理是差不多的,无非就是在php程序里面用正则匹配将模板里面的标签替换为php代码从而将两者混合为一个ph ...
- MOOC 编译原理笔记(一):编译原理概述以及程序设计语言的定义
编译原理概述 什么是编译程序 编译程序指:把某一种高级语言程序等价地转换成另一张低级语言程序(如汇编语言或机器代码)的程序. 高级语言程序-翻译->机器语言程序-运行->结果. 其中编译程 ...
- nvGRAPH原理概述
nvGRAPH原理概述 nvGRAPH的API参考分析. 简介 数据分析是高性能计算的不断增长的应用.许多高级数据分析问题可以称为图形问题.反过来,当今许多常见的图形问题也可以称为稀疏线性代数.这是N ...
- Smarty模板引擎原理概述
smarty(模板引擎,模板技术) 使用smarty主要是为了实现逻辑和外在内容的分离: 特点: 1.速度快(因为第二次执行的时候使用第一次执行时生成的编译文件) 2.缓存技术(正是因为缓存技术,使得 ...
- kvo原理概述
kvo概述 kvo,全称Key-Value Observing,它提供了一种方法,当对象某个属性发生改变时,允许监听该属性值变化的对象可以接受到通知,然后通过kvo的方法响应一些操作. kvo实现原理 ...
- 基于 EntityFramework 的数据库主从读写分离架构(1) - 原理概述和基本功能实现
回到目录,完整代码请查看(https://github.com/cjw0511/NDF.Infrastructure)中的目录: src\ NDF.Data.EntityFramew ...
- PHP的模板引擎smarty原理浅谈
mvc是开发中的一个伟大的思想,使得开发代码有了更加清晰的层次,让代码分为了三层各施其职.无论是对代码的编写以及后期的阅读和维护,都提供了很大的便利. 我们在php开发中,视图层view是不允许有ph ...
随机推荐
- 第二十节,基本数据类型,集合set、综合应用新数据更新老数据
基本数据类型,集合set.综合应用新数据更新老数据 创建两个字典新数据,更新原始数据,a为原始数据,b为新数据 1,分别获取到a字典和b字典的key(键),将两个字典的键分别转换成两个集合 2,找出a ...
- hdu_5783_Divide the Sequence(贪心)
题目链接:hdu_5783_Divide the Sequence 题意: 给你一个数列,让你分尽可能多的段,并且保证每一段的前缀和都不小于0 题解: 从后往前xjb贪心就行了 #include< ...
- hdu_2110_Crisis of HDU(母函数)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2110 题意:给你N个价值和数目,求方案数,很裸的母函数. #include<cstdio> ...
- Cake
Cake Time Limit : 1000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submissi ...
- ORACLE里锁有以下几种模式,v$locked_object,locked_mode【转】
ORACLE里锁有以下几种模式:0:none1:null 空2:Row-S 行共享(RS):共享表锁,sub share 3:Row-X 行独占(RX):用于行的修改,sub exclusive 4: ...
- 动软数据库文档生成器 失败错误码HRESULT:0x80010105 解决办法
是否在关闭office文档模板时提示拼写错误语法检查太多而导致失败?如果是提示这个错误的话,可以将拼写检查和语法检查关掉即可.下附相关链接:http://support.microsoft.com/k ...
- phpStorm 2016.1.2 最新版激活方法【亲测可用】
测试日期:2016-07-29 下载地址:https://yunpan.cn/c6mWAGbExcyjf 访问密码 00fb 1.windows版本 菜单help >>>> ...
- c++判断一个字符串是否是数字
bool isNum(const string& str) { bool bRet = false; bool point = false; ) { return bRet; } ]) &am ...
- php UNIX时间戳转换为指定日期格式
用函数: date() 一般形式:date('Y-m-d H:i:s', unix时间) $date_unix=time();//获取当前时间,unix时间戳 echo 'Unix时间:'.$date ...
- Object调用控件的办法
<OBJECT id="pwdpad" style="LEFT: 0px; WIDTH: 35px; TOP: 0px; HEIGHT: 16px" cl ...