为了实现程序的业务逻辑和内容表现页面的分离从而提高开发速度,php 引入了模板引擎的概念,php 模板引擎里面最流行的可以说是smarty了,smarty因其功能强大而且速度快而被广大php web开发者所认可。本文将记录一下smarty模板引擎的工作执行原理,算是加深一下理解。

其实所有的模板引擎的工作原理是差不多的,无非就是在php程序里面用正则匹配将模板里面的标签替换为php代码从而将两者混合为一个php的混编文件,然后执行这个混编文件。基本上就是这么回事儿了。下面以smarty为例说下这个过程。

例如本站文章页面:http://www.phpernote.com/article.php?id=795

一般处理过程是这样的:

html模板页面部分代码(article.html):

{subject}
{content}

php页面逻辑部分代码:

$subject='smarty视频教程分享';

$content='smarty视频教程分享,下面是具体的下载地址,有需要的朋友可以看看,对smarty模板讲解的非常详细,作者粗略看了一下目录,真是详细到细枝末节该......';

$str=file_get_contents('article.html');

$str=str_replace('{subject}',$subject,$str);

$str=str_replace('{content}',$content,$str);

echo $str;

使用面向对象技术实现模板功能的封装代码如下:

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、 之后每次访问都会访问编译文件

如果启用缓存文件而且有缓存文件并且缓存文件没有过期,则直接访问缓存文件(先不考虑缓存的时候的流程)编译文件里时间戳记录模板文件修改时间,如果模板被修改过就可以检测到,然后重新编译。

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

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

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

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

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

对于以上文字可以抽象的理解为下面的一幅图,读者自己去体会吧!

考虑缓存:

在smarty程序里,判断是否开启了缓存文件,并且缓存文件没有过期,,就去找缓存文件,如果没有开启缓存文件,就去判断模板文件,如果缓存文件已过期,也是去判断模板文件。

smarty 执行php,smarty模板执行原理相关推荐

  1. ecshop模板的原理分析

    模板的原理 类似Smarty/ECShop这类模板的原理如下图所示. 1.首先是编译模板ECShop/Smart是利用PHP引擎,所以编译的结果是一个PHP文件,其编译过程就是 将分隔符{}替换成PH ...

  2. smarty模板引擎原理解析

    //php 控制器文件 <?php //引入模板引擎文件 include("20130304.php"); $smarty = new TinySmarty(); $qq_n ...

  3. 写一个迷你版Smarty模板引擎,对认识模板引擎原理非常好(附代码)

    前些时间在看创智博客韩顺平的Smarty模板引擎教程,再结合自己跟李炎恢第二季开发中CMS系统写的tpl模板引擎.今天就写一个迷你版的Smarty引擎,虽然说我并没有深入分析过Smarty的源码,但是 ...

  4. php smarty变量调节器,Smarty模板变量与调节器实例详解

    本文实例讲述了Smarty模板变量与调节器.分享给大家供大家参考,具体如下: Smarty中assign说明 可能有人在学习smarty的时候已经学习了一些php框架,如tp.laravel.Yii等 ...

  5. Smarty中文手册,Smarty教程,Smarty模板的入门教材

    Smarty中文手册,Smarty教程,Smarty模板的入门教材 首先,这份Smarty中文手册的翻译工作是由喜悦国际村村民自发组织的,不代表任何人的意见和观点.对他们的无私奉献精神,我们表示感谢, ...

  6. php yaf smarty,Yaf 结合用户自定义的视图(模板)引擎Smarty(Yaf + Smarty)

    Yaf 结合用户自定义的视图(模板)引擎Smarty(Yaf + Smarty) 来源:互联网 作者:佚名 时间:2015-08-06 07:55 对完成某个任务进行计时可使用progress_tim ...

  7. vue function (i)第一次点击不执行_vue下$nextTick及原理浅析

    vue->$nextTick 引用官方的话:为了在数据变化之后等待 Vue 完成更新 DOM ,可以在数据变化之后立即使用 Vue.nextTick(callback) ex1 <div& ...

  8. atitit.跨语言执行cmd cli api的原理及兼容性设计草案

    atitit.跨语言执行cmd cli api的原理及兼容性设计草案 1. 标准输入,标准输出,标准错误与重新定向1 2. 常见问题2 2.1. 执行bat文件2 2.2. 执行bat文件  /c   ...

  9. 使用 Packer 自动执行 VMware vsphere 模板

    在这篇博客文章中,我想向您展示如何使用 Packer 自动执行 VMware vsphere 模板.我喜欢它,因为packer可以在其他平台上使用,如Hyper-V,Azure,AWS或soagar ...

  10. pmd java规则_PMD执行Java代码分析的原理

    PMD执行Java代码分析的原理 PMD是一种代码静态分析工具,当使用PMD规则分析Java源码时,PMD首先利用JavaCC和EBNF文法产生了一个语法分析器,用来分析普通文本形式的Java代码,产 ...

最新文章

  1. MySQL主从同步问题集
  2. DataVeryLite和Nhibernate性能对比
  3. HTML5做手机站页面字体显示很小的解决方法
  4. 英语考试(最小生成树)
  5. [渝粤教育] 西南科技大学 投资经济学 在线考试复习资料(2)
  6. js二维数组arr中表示读取第i行第j列的是:_c++ c语言 数组与字符串
  7. Python——五分钟理解函数式编程与闭包
  8. 图论:二分图多重匹配
  9. HTML的基本知识(七)——表单的基本知识及案例
  10. Esri大赛必备:3度带6度带中央经线及带号换算问题
  11. python selenium ActionChains类与鼠标的模拟事件
  12. 常见电商模式B2B、B2C、C2B、C2C、O2O
  13. 2018年人工智能领域研发热点回眸
  14. 西部狂徒自建服务器,在《西部狂徒》中如何快速建立自己根据地?杀人放火是上策...
  15. Windows Support Tools
  16. 软文推广类的文章怎么写?
  17. 深度学习高温蒸馏:Softmax With Temperature
  18. android 10.0 展讯 MTK内置可卸载app
  19. 关于 四舍六入五成双/四舍六入五留双/四舍六入五单双 等口诀的实例研究
  20. java逻辑他推理之公式逆推

热门文章

  1. python 模块下载成功,却无法导入?
  2. IDEA 开启远程调试
  3. python+pdf2docx+tkinter PDF转word小工具打包成exe
  4. php登录界面的代码,php登录页面()代码
  5. pdf 复制文本 乱码_如何在保留格式的同时从PDF复制文本?
  6. Window 平台下添加 tree 命令
  7. 【JAVA】poi操作,excel读取数据。
  8. Window系统安装FFmpeg教程
  9. Oracle RMAN备份与还原
  10. Maven下载及安装