smarty 执行php,smarty模板执行原理
為了實(shí)現(xiàn)程序的業(yè)務(wù)邏輯和內(nèi)容表現(xiàn)頁面的分離從而提高開發(fā)速度,php 引入了模板引擎的概念,php 模板引擎里面最流行的可以說是smarty了,smarty因其功能強(qiáng)大而且速度快而被廣大php web開發(fā)者所認(rèn)可。本文將記錄一下smarty模板引擎的工作執(zhí)行原理,算是加深一下理解。
其實(shí)所有的模板引擎的工作原理是差不多的,無非就是在php程序里面用正則匹配將模板里面的標(biāo)簽替換為php代碼從而將兩者混合為一個(gè)php的混編文件,然后執(zhí)行這個(gè)混編文件。基本上就是這么回事兒了。下面以smarty為例說下這個(gè)過程。
例如本站文章頁面:http://www.phpernote.com/article.php?id=795
一般處理過程是這樣的:
html模板頁面部分代碼(article.html):
{subject}{content}php頁面邏輯部分代碼:
$subject='smarty視頻教程分享';
$content='smarty視頻教程分享,下面是具體的下載地址,有需要的朋友可以看看,對smarty模板講解的非常詳細(xì),作者粗略看了一下目錄,真是詳細(xì)到細(xì)枝末節(jié)該......';
$str=file_get_contents('article.html');
$str=str_replace('{subject}',$subject,$str);
$str=str_replace('{content}',$content,$str);
echo $str;
使用面向?qū)ο蠹夹g(shù)實(shí)現(xiàn)模板功能的封裝代碼如下:
class Template{
//屬性
public $vars; //保存要替換的標(biāo)記和數(shù)據(jù)的內(nèi)容
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);//從模板中讀取多有內(nèi)容,并將內(nèi)容放入$str中
foreach ($this->vars as $key => $value){ //$key 鍵名(模板標(biāo)記) $value 值
$str=str_replace($this->left_delimiter.$key.$this->right_delimiter, $value, $str);
}
echo $str;
//file_put_contents('bak.html', $str);
}
}
注意:assign(‘name’,’zhangsan’);這句的時(shí)候其實(shí)還沒有進(jìn)行數(shù)據(jù)替換,而是把傳入的數(shù)據(jù)保存在vars[]中,當(dāng)display的時(shí)候才進(jìn)行數(shù)據(jù)替換。
smarty的處理過程:
1、 smarty將php源文件,首先編譯成中間文件
2、 如果啟用緩存,再根據(jù)編譯文件生成緩存文件
3、 之后每次訪問都會訪問編譯文件
如果啟用緩存文件而且有緩存文件并且緩存文件沒有過期,則直接訪問緩存文件(先不考慮緩存的時(shí)候的流程)編譯文件里時(shí)間戳記錄模板文件修改時(shí)間,如果模板被修改過就可以檢測到,然后重新編譯。
(編譯是把靜態(tài)內(nèi)容保存起來,動(dòng)態(tài)內(nèi)容根據(jù)傳入的參數(shù)不同而不同)
讀取編譯文件省去了讀取模板文件,和字符串替換的時(shí)間,所以可以更快。
第一次請求article.php時(shí)候編譯,產(chǎn)生編譯文件,在編譯文件里。
第二次請求article.php的時(shí)候,判斷模板文件是否改變,如果模板文件已改變,那么去讀取模板文件,然后再編譯,如果沒有改變,則去讀取編譯文件,編譯文件最終輸出;
緩存默認(rèn)是關(guān)閉的;緩存是把數(shù)據(jù)徹底的存在緩存文件里,直到緩存文件過期才會重新來緩存;所以說smarty在一些實(shí)時(shí)性特別強(qiáng)的網(wǎng)站里不是特別合適;
對于以上文字可以抽象的理解為下面的一幅圖,讀者自己去體會吧!
考慮緩存:
在smarty程序里,判斷是否開啟了緩存文件,并且緩存文件沒有過期,,就去找緩存文件,如果沒有開啟緩存文件,就去判斷模板文件,如果緩存文件已過期,也是去判斷模板文件。
總結(jié)
以上是生活随笔為你收集整理的smarty 执行php,smarty模板执行原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 大智慧 dll 交易_大智
- 下一篇: 让你的网速快到不可思议