smarty 执行php,smarty模板执行原理
為了實現程序的業務邏輯和內容表現頁面的分離從而提高開發速度,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模板执行原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 大智慧 dll 交易_大智
- 下一篇: PHP - Smarty模板引擎 - D