转自: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语言读取模板文件完成字符串替换掉的过程

详解代码如下:

  1. html页面:
  2. <body>
  3. <font color = 'red'>{id}</font><br>
  4. <font color = 'green'>{name}</font><br>
  5. <font color = 'bule'>{age}</font><br>
  6. </body>
  7.  
  8. 后台逻辑部分
  9. //
  10. $id=8;
  11. $name='zhangsan';
  12. $age = 12;
  13.  
  14. $str = file_get_contents('demo1.html');//模板文件的所有内容
  15. $str = str_replace('{id}', $id, $str);//替换id
  16. $str = str_replace('{name}', $name, $str);
  17. $str = str_replace('{age}', $age, $str);
  18. echo $str;
  19. ?>

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

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

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

smarty的处理过程:

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

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

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

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

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

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

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

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

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

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

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

考虑缓存:

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

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

smarty(原理概述)的更多相关文章

  1. linux软中断与硬中断实现原理概述

    linux软中断与硬中断实现原理概述. 1.软中断通过open_softirq注册一个软中断处理函数,即在软中断向量表softirq_vec数组中添加新的软中断处理action函数. 2.调用rais ...

  2. InspectIT_EUM 实现原理概述

    在Git上查看 InspectIT 实现原理概述: 实现原理详解:  1.jsAgent如何注入到浏览器 通过ASM框架修改HttpService.service()方法,加入相关逻辑,对每一个Htt ...

  3. PHP的模板引擎smarty原理是什么(整理)

    PHP的模板引擎smarty原理是什么(整理) 一.总结 一句话总结:其实所有的模板引擎的工作原理是差不多的,无非就是在php程序里面用正则匹配将模板里面的标签替换为php代码从而将两者混合为一个ph ...

  4. MOOC 编译原理笔记(一):编译原理概述以及程序设计语言的定义

    编译原理概述 什么是编译程序 编译程序指:把某一种高级语言程序等价地转换成另一张低级语言程序(如汇编语言或机器代码)的程序. 高级语言程序-翻译->机器语言程序-运行->结果. 其中编译程 ...

  5. nvGRAPH原理概述

    nvGRAPH原理概述 nvGRAPH的API参考分析. 简介 数据分析是高性能计算的不断增长的应用.许多高级数据分析问题可以称为图形问题.反过来,当今许多常见的图形问题也可以称为稀疏线性代数.这是N ...

  6. Smarty模板引擎原理概述

    smarty(模板引擎,模板技术) 使用smarty主要是为了实现逻辑和外在内容的分离: 特点: 1.速度快(因为第二次执行的时候使用第一次执行时生成的编译文件) 2.缓存技术(正是因为缓存技术,使得 ...

  7. kvo原理概述

    kvo概述 kvo,全称Key-Value Observing,它提供了一种方法,当对象某个属性发生改变时,允许监听该属性值变化的对象可以接受到通知,然后通过kvo的方法响应一些操作. kvo实现原理 ...

  8. 基于 EntityFramework 的数据库主从读写分离架构(1) - 原理概述和基本功能实现

        回到目录,完整代码请查看(https://github.com/cjw0511/NDF.Infrastructure)中的目录:      src\ NDF.Data.EntityFramew ...

  9. PHP的模板引擎smarty原理浅谈

    mvc是开发中的一个伟大的思想,使得开发代码有了更加清晰的层次,让代码分为了三层各施其职.无论是对代码的编写以及后期的阅读和维护,都提供了很大的便利. 我们在php开发中,视图层view是不允许有ph ...

随机推荐

  1. java中的静态变量

    大家都知道,我们可以基于一个类创建多个该类的对象,每个对象都拥有自己的成员,互相独立.然而在某些时候,我们更希望该类所有的对象共享同一个成员.此时就是 static 大显身手的时候了!! Java 中 ...

  2. POJ 1258 Agri-Net(Prim)

    ( ̄▽ ̄)" #include<iostream> #include<cstdio> #include<cmath> #include<algori ...

  3. 第一个WebAPI项目

    (1)新建一个ASP.NET MVC项目,取名为:MyMvcWebAPIDemo,项目类型选择WebAPI. (2)在Models中新增一个类,取名为:Product,作为我们要测试的实体模型.   ...

  4. 在windows命令行窗口下执行:查看所有的端口占用情况

    开始--运行--cmd 进入命令提示符 输入netstat -ano 即可看到所有连接的PID 之后在任务管理器中找到这个PID所对应的程序如果任务管理器中没有PID这一项,可以在任务管理器中选&qu ...

  5. shell:crontab

    crontab */1 * * * * (cd /home/q/system/project; /usr/bin/lockf -t 0 /tmp/discuz_bbs_audit.lock /usr/ ...

  6. SQL Server不能通过外部IP访问,解决方法

    SQL Server不能通过外部IP访问,解决方法   版本:SQL server 2008 express with tools   打开配置管理器,开启 TCP,右键属性设置TCP端口:   设置 ...

  7. Qt之打包发布(NSIS详解)

    来源:http://blog.sina.com.cn/s/blog_a6fb6cc90101fer8.html 发布方式    Qt发布的时候,通常使用两种方式:   (1)静态编译  (2)动态编译 ...

  8. wpf之数据触发器DataTrigger

    wpf, 根据绑定的属性的值的不同(数据分类),界面上显示不同的控件(绑定不同类型的属性),可以使用数据库触发器DataTrigger实现这一功能. 实现的效果如下: 首先建立实体类: 更改通知类: ...

  9. 使用SQL Server Management Studio 创建作业备份数据库

    在项目中,经常需要备份数据库,如果能做到只需点个按钮(“开始备份数据库”按钮),然后什么都不管,数据库就自动备份好了,或者服务器上的数据库隔一段时间自动备份一次,那该多好啊. Sql server 的 ...

  10. OpenGL------版本历史

    到今天为止,正式的OpenGL已经有九个版本.(1.0, 1.1, 1.2, 1.2.1, 1.3, 1.4, 1.5, 2.0, 2.1)每个OpenGL版本的推出,都增加了一些当时流行的或者迫切需 ...