為了實現程序的業務邏輯和內容表現頁面的分離從而提高開發速度,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程序裡,判斷是否開啟了緩存文件,並且緩存文件沒有過期,,就去找緩存文件,如果沒有開啟緩存文件,就去判斷模板文件,如果緩存文件已過期,也是去判斷模板文件。