方法一、使用在父模板中使用{include file="child.tpl"}直接將子模板包含進來
優點:
1、有利於模組的劃分和模板的重用。
2、嵌套層次不多的時候,模板的結構清晰,一眼過去就知道這個模板的內容和結構。
3、只需要一個smarty執行個體就能做完所有的事情,減少系統資源的佔用。
不足:
1、子模板中的變數可能與父模板的變數發生衝突
2、多重嵌套的時候,變數名衝突的幾率增大,為所有的變數賦值的難度也加大。
3、子模板的可操控性差,例如不能通過設定$cache_id, $compile_id,來得到多個結果。
4、擴充性差。如果需要添加新的模板的時候需要修改模板,同時還需要修改程式。
方法二、通過$smarty->fetch()將子模板的資料當成變數assign到父模板中
優點:
1、同樣有利於模組的劃分,模板的重用
2、模板的結構同樣清晰
3、子模板作為單獨的對象,可操控性強
4、擴充性較好
5、每個子模板都是單獨的對象,不會出現變數名衝突的問題
不足:
1、如果子模板多的時候,需使用多個smarty執行個體來實現,PHP代碼顯得臃腫
2、佔用較多的系統資源
3、......
在那個的時候,出於對效能的要求,以及在沒有測試的情況下,想當然的認為include的效能一定就比fetch的效能要高,所有本人使用include這個方法,結果隨著系統功能的不斷的增加,感覺到越寫越複雜,這有很大一部分原因是設計的問題,但是模板間的嵌套也是問題之一,於是回過頭來考慮使用fetch這個方法。在重新做出決定之前對這個方法的效能做了測試,分別對單個模板的情況下和多個模板的情況進行測試
單個子模板測試:
有三個頁面test1.php,test2.php,test3.php。這三個頁面都輸出同樣的內容。test1.php的模板沒有嵌套,test2.php的模板使用了一次include,test3.php使用fetch來實現子模板的嵌套。使用apache內建的ab測試訪問各個頁面所需要的平均時間(單位:ms)
第一次測試時,使用ab -n 10000 對以上三個頁面進行10次,每次累計10000個訪問,結果如下。
| ab -n 10000 |
test1.php |
test2.php |
test3.php |
test2/test1 |
test3/test1 |
| 1 |
5.178 |
5.442 |
6.097 |
1.050984936 |
1.177481653 |
| 2 |
5.253 |
5.972 |
6.027 |
1.136874167 |
1.147344375 |
| 3 |
5.223 |
6.039 |
5.987 |
1.156232051 |
1.146276087 |
| 4 |
5.533 |
5.997 |
6.02 |
1.083860474 |
1.08801735 |
| 5 |
5.557 |
6.308 |
6.03 |
1.135144862 |
1.085117869 |
| 6 |
5.248 |
6.002 |
5.998 |
1.14367378 |
1.142911585 |
| 7 |
5.211 |
5.933 |
6.003 |
1.138553061 |
1.151986183 |
| 8 |
5.303 |
6.031 |
6.048 |
1.137280784 |
1.140486517 |
| 9 |
5.213 |
5.923 |
6.033 |
1.136197967 |
1.15729906 |
| 總計 |
47.719 |
53.647 |
54.243 |
1.124227247 |
1.136717031 |
第二次測試時,使用ab -n 100000 對以上三個頁面進行1次,每次累計100000個訪問,結果如下。
| ab -n 100000 |
test1.php |
test2.php |
test3.php |
test2/test1 |
test3/test1 |
| 1 |
5.723 |
7.874 |
8.55 |
1.375851826 |
1.493971693 |
第一次測試的資料中,test1和test2的波動比較明顯,test3則比較穩定,這個現象讓我感到十分的奇怪。從平均資料來看,測試結果還是在預期之內的,test1的效能最好,test2比test1多耗費了12.42%的時間,test3比test1多耗費了13.67%的時間,但是test2和test3之間的差距並不大,僅僅只有1.3%左右的差別。
第二次測試的結果,三個頁面的執行時間比為1:1.37:1.49,奇怪的是這次的波動更大。。。
多個子模板測試:
同樣有三個頁面test1.php,test2.php,test3.php。這三個頁面都輸出同樣的內容。test1.php的模板沒有嵌套,test2.php的模板使用了10次include嵌入了10個子模板,test3.php使用10次fetch嵌入了10個子模板。使用apache內建的ab測試訪問各個頁面所需要的平均時間(單位:ms)
因為時間的關係我只進行了一次ab -n 50000的測試,資料如下
| ab -n 50000 |
test1.php |
test2.php |
test3.php |
test2/test1 |
test3/test1 |
| 1 |
5.68 |
6.054 |
6.028 |
1.06584507 |
1.061267606 |
雖然測試的方法和工具可能不是很好,但是通過這些資料的對比,在實際的應用中到底要採用哪種方法,我想大家應該心裡有底了吧。
不足和錯誤之處還望指出,希望大家能多討論多交流。
http://www.bkjia.com/PHPjc/322601.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/322601.htmlTechArticle方法一、使用在父模板中使用{include file="child.tpl"}直接將子模板包含進來 優點: 1、有利於模組的劃分和模板的重用。 2、嵌套層次不多的時...