smarty(模板引擎,模板技術)
使用smarty主要是為了實現邏輯和外在內容的分離;
特點:
1、速度快(因為第二次執行的時候使用第一次執行時生成的編譯文件)
2、緩存技術(正是因為緩存技術,使得smarty模板技術不太適合那些對於實時性更新要求比較高的,比如股票信息)
3、插件技術
4、緩存技術
5、語句自由靜態頁面技術實際上是以空間換時間的技術:
http://localhost/news.php?id=8比如這個是某門戶網站的新聞頁面,
很多人訪問,每次都要去數據庫里查詢,可以再第一次訪問的時候生成一個html頁面,以后的訪問者都是訪問這個靜態頁面)
數據庫--->靜態頁面
分析模板技術:是利用php語言讀取模板文件完成字符串替換掉的過程
詳解代碼如下:
html頁面: <body> <font color = 'red'>{id}</font><br> <font color = 'green'>{name}</font><br> <font color = 'bule'>{age}</font><br> </body> 后台邏輯部分 // $id=8; $name='zhangsan'; $age = 12; $str = file_get_contents('demo1.html');//模板文件的所有內容 $str = str_replace('{id}', $id, $str);//替換id $str = str_replace('{name}', $name, $str); $str = str_replace('{age}', $age, $str); echo $str; ?>
面向對象技術實現模板功能的封裝
1 <?php 2 class Template 3 { 4 //屬性 5 public $vars; //保存要替換的標記和數據的內容 6 public $left_delimiter = '{*'; //左分隔符 7 public $right_delimiter = '*}'; //右分隔符 8 //方法 9 public function assign($key,$value) 10 { 11 12 $this->vars[$key] = $value; 13 } 14 public function display($file) //file表示模板名 15 { 16 $str = file_get_contents($file); //從模板中讀取多有內容,並將內容放入$str中 17 foreach ($this->vars as $key => $value) //$key 鍵名(模板標記) $value 值 18 { 19 $str = str_replace($this->left_delimiter.$key.$this->right_delimiter, $value, $str); 20 } 21 echo $str; 22 //file_put_contents('bak.html', $str); 23 } 24 } 25 ?>
注意:assign(‘name’,’zhangsan’);這句的時候其實還沒有進行數據替換,而是把傳入的數據保存在vars[]中,當display的時候才進行數據替換
smarty的處理過程:
1、 smarty將php源文件,首先編譯成中間文件
2、 如果啟用緩存,再根據編譯文件生成緩存文件
3、 之后每次訪問都會訪問編譯文件
如果啟用緩存文件而且有緩存文件並且緩存文件沒有過期,則直接訪問緩存文件
(先不考慮緩存的時候的流程)
編譯文件里時間戳記錄模板文件修改時間,如果模板被修改過就可以檢測到,然后重新編譯
(編譯是把靜態內容保存起來,動態內容根據傳入的參數不同而不同)
讀取編譯文件省去了讀取模板文件,和字符串替換的時間,所以可以更快
第一次請求demo.php時候編譯,產生編譯文件,在編譯文件里
第二次請求demo.php的時候,判斷模板文件是否改變,如果模板文件已改變,那么去讀取模板文件,然后再編譯,如果沒有改變,則去讀取編譯文件,編譯文件最終輸出;
緩存默認是關閉的;緩存是把數據徹底的存在緩存文件里,直到緩存文件過期才會重新來緩存;所以說smarty在一些實時性特別強的網站里不是特別合適;
考慮緩存:
在smarty程序里,判斷是否開啟了緩存文件,並且緩存文件沒有過期,,就去找緩存文件
如果沒有開啟緩存文件,就去判斷模板文件,如果緩存文件已過期,也是去判斷模板文件。