程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> smarty模板執行原理

smarty模板執行原理

編輯:關於PHP編程

為了實現程序的業務邏輯和內容表現頁面的分離從而提高開發速度,php 引入了模板引擎的概念,php 模板引擎裡面最流行的可以說是smarty了,smarty因其功能強大而且速度快而被廣大php web開發者所認可。本文將記錄一下smarty模板引擎的工作執行原理,算是加深一下理解。

其實所有的模板引擎的工作原理是差不多的,無非就是在php程序裡面用正則匹配將模板裡面的標簽替換為php代碼從而將兩者混合為一個php的混編文件,然後執行這個混編文件。基本上就是這麼回事兒了。下面以smarty為例說下這個過程。

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

一般處理過程是這樣的:

html模板頁面部分代碼(article.html):

<body>
<div>{subject}</div>
<div>{content}</div>
</body>

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;

使用面向對象技術實現模板功能的封裝代碼如下:

<?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、 之後每次訪問都會訪問編譯文件

如果啟用緩存文件而且有緩存文件並且緩存文件沒有過期,則直接訪問緩存文件(先不考慮緩存的時候的流程)編譯文件裡時間戳記錄模板文件修改時間,如果模板被修改過就可以檢測到,然後重新編譯。

(編譯是把靜態內容保存起來,動態內容根據傳入的參數不同而不同)

讀取編譯文件省去了讀取模板文件,和字符串替換的時間,所以可以更快。

第一次請求article.php時候編譯,產生編譯文件,在編譯文件裡。

第二次請求article.php的時候,判斷模板文件是否改變,如果模板文件已改變,那麼去讀取模板文件,然後再編譯,如果沒有改變,則去讀取編譯文件,編譯文件最終輸出;

緩存默認是關閉的;緩存是把數據徹底的存在緩存文件裡,直到緩存文件過期才會重新來緩存;所以說smarty在一些實時性特別強的網站裡不是特別合適;

對於以上文字可以抽象的理解為下面的一幅圖,讀者自己去體會吧!

smarty模板執行原理

考慮緩存:

在smarty程序裡,判斷是否開啟了緩存文件,並且緩存文件沒有過期,,就去找緩存文件,如果沒有開啟緩存文件,就去判斷模板文件,如果緩存文件已過期,也是去判斷模板文件。

您可能感興趣的文章

  • smarty 模板中循環表格補充不全的td
  • smarty模板中for循環的擴展插件
  • smarty模板中如何生成隨機數
  • smarty模板中判斷數組為空的方法
  • 程序中通過define定義的常量如何在smarty模板中使用
  • smarty模板中使用php函數以及smarty模板中如何對一個變量使用多個函數
  • smarty模板中給信息添加最新標簽
  • smarty模板保留變量總結

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved