Quan điểm của tôi về Smarty, PHPSavant hay sự lựa chọn template engine hay template system

688 views
Skip to first unread message

pcdinh

unread,
Sep 7, 2007, 3:21:08 PM9/7/07
to PHPVietnam
Cách đây 1 năm tôi có một bài thuyết trình trước Project Manager và
Solution Architect về quan điểm của nhóm developer đối với sự lựa chọn
template engine/system (Smarty, Savant...) trong dự án PHP trong quá
trình chạy lấy đà cho dự án PHP (outsourcing cho người Nhật). Nhân có
sự thảo luận về chủ đề này, tôi có thêm một số note vào các slide để
các bạn đọc dễ theo dõi. Các bạn tìm cách slide này trong mục Files
của discussion group này.

Mọi feedback đều được chào đón.

tumickey

unread,
Sep 7, 2007, 9:40:24 PM9/7/07
to PHPVietnam

hi pcdinh ,
cám ơn về cái slide,
TMK chưa coi qua Savant mà hiện nay trang chủ http://phpsavant.com
đang hư nên cũng chả làm gì được .
Nhưng hình qua slide của anh thì thấy là nó cũng ko khác gì việc nhúng
php vao html thì cái hơn của nó với việc dùng nó và nhúng html vào
php ? Có lẽ hơi thừa khi chưa coi savant mà hỏi nhưng mong ý kiến của
mọi người.

Huy

unread,
Sep 7, 2007, 9:54:16 PM9/7/07
to PHPVietnam
Quan trọng đó là mã PHP gì ? Mã PHP đó là mã presentation logic.

TMK nên chú ý đến khía cạnh tách biệt presentation logic và business
logic. Đó là nguyên nhân chính để trả lời cho câu hỏi tại sao phải
dùng template engine hoặc system.

On Sep 8, 8:40 am, tumickey <tumic...@gmail.com> wrote:
> hi pcdinh ,
> cám ơn về cái slide,

> TMK chưa coi qua Savant mà hiện nay trang chủhttp://phpsavant.com

pcdinh

unread,
Sep 8, 2007, 3:03:48 AM9/8/07
to PHPVietnam
TMK tải về cái file PDF: http://groups.google.com/group/phpvietnam/files
Cái file odp mở bằng Open Office Impress, chuyển sang tab Note sẽ thấy
các note tren từng slide. Đ. đã trả lời câu hỏi này rồi.

Với file PDF thì các note và slide nằm trên cùng trang nên dễ đọc hơn.

On Sep 8, 8:40 am, tumickey <tumic...@gmail.com> wrote:

> hi pcdinh ,
> cám ơn về cái slide,

> TMK chưa coi qua Savant mà hiện nay trang chủhttp://phpsavant.com

lkn

unread,
Sep 8, 2007, 5:05:08 AM9/8/07
to PHPVietnam
Savant cũng có cùng một cách thức như: http://www.sitepoint.com/print/beyond-template-engine

vn_tsunami_9

unread,
Sep 9, 2007, 11:47:53 PM9/9/07
to PHPVietnam
chao bac dinh. e Thang o triax day. theo em hieu thi thi dung savant
va smarty no cung giong nhau thoai.

BinhPham

unread,
Sep 12, 2007, 5:34:55 AM9/12/07
to PHPVietnam
Smarty sử dụng các Regular Expression để compile mã template ra mã php
rồi mới chạy, khác hoàn toàn với PHPSavant. PHPSavant không tự nó
compile mà chỉ hỗ trợ tách Business logic ra khỏi presentation logic
thôi. Về tốc độ thì chắc chắn PHPSavant sẽ nhanh hơn

mrphpvn

unread,
Sep 13, 2007, 1:22:52 PM9/13/07
to PHPVietnam
Smarty ko chậm hơn đâu bạn à, Nguyên tắc của smarty là nó chỉ chạy
chậm lần đầu, còn từ lần thứ 2 trở đi nó sẽ chỉ chạy file đã compile,
bạn có thể xoá file template đi thoải mái. Hơn nữa mã nó compile ra
lại chính là dạng nhúng PHP vào HTML rất đơn giản, mà lại là dạng chạy
nhanh nhất.
Nên ko có sự ngẫu nhiên nào mà những người phát triển smarty lại đặt
nó là Smarty (nhanh).
Mình cũng đã làm outsource cho Nhật và thấy là tụi Nhật nó ưa Smarty
nhất đó còn ko là nó viết luôn mã PHP vào HTML.

pcdinh

unread,
Sep 13, 2007, 10:52:33 PM9/13/07
to PHPVietnam

Bạn chưa benchmark đúng không?

Những thử nghiệm của tôi cho thấy Smarty chậm hơn giải pháp templating
system từ 80 - 200%. Kể cả khi nó đã được biên dịch thì nó vẫn chậm
hơn 20-30% do kết cấu mã sinh ra phức tạp hơn mà dù đều là PHP (ví dụ:
việc sử dụng cấu trúc mảng đa chiều...). Nếu bạn dùng shared hosting
thì bạn đã thử xóa các file template nó sinh ra chưa :D

Không nên thấy bên Nhật làm vậy thì mình bắt chước. Bắt chước cái khôn
của họ thôi. Smarty năm 2002 là nhanh, nhưng năm 2007 nó là siêu chậm.
Nhưng cái quan trọng ko hẳn là tốc độ mà là cách nhìn sai lầm của
người thiết kế Smarty do những ảnh hưởng từ JSTL, Velocity của Java.
PHP là ngôn ngữ nhúng. Nếu nhúng tất thì có hại, nhúng 1 lượng rất nhỏ
để tận dụng tính thiết kế của nó thì hoàn toàn có lợi. Chính vì thế
các framework hàng đầu hiện nay như Zend Framework, SolarPHP, CakePHP,
Symfony, Phrame, Mojavi/Agavi, Akelos.. đều sử dụng PHP như là
template system. Họ chỉ trừu tượng hóa phần View. Cái quan trọng của
người lập trình PHP là sự hình thành tư duy tách biệt 3 bộ phận trong
một page thành M-V-C chứ không phải là sự ép buộc phải dùng một ngôn
ngữ khác với PHP khiến cho lập trình viên ko có cách nào khác là phải
tách biệt templating code và logic/data manipulation code.

Việc tách biệt templating code và logic/data manipulation code thì mới
chỉ đưa ứng dụng đến mức modular của ASP.NET, một framework mà tôi cho
là khá yếu hay chưa đủ chín về mặt kiến trúc modular trên nền web .
Nếu chỉ dừng mức đó mà cần đến một giải pháp cỡ như Smarty thì tôi cho
là kém hiệu quả.

Smarty chỉ có tác dụng với 1% các dự án PHP khi mà tính năng cá nhân
hóa trên template được sử dụng. Và để tránh tính phức tạp khi các user
ko quen biết nhúng mã PHP độc vào template được submit lên và ko có
một quy trình kiểm soát hiệu quả thì Smarty được ưa chuộng. Phải chăng
là các dự án kiểu đó thì chỉ có Smarty làm được? Sai lầm. PHPSavant có
cơ chế hook một compiler vào engine của nó để dịch các custom tags
kiểu như Smarty tags sang PHP. Nghĩa là bạn có thể xử lý một template
file theo 3 bước
+ Xóa sạch các thẻ PHP được nhúng vào
+ Phân tách các custom tags mà nó detect được và đước phép detect
thành mã PHP
+ Thực hiện việc thay thế và build compiled files như ở Smarty.

Vì các giải pháp templating system dựa trên PHP cho nên nó được được
hỗ trợ về mặt tooling trên các IDE hay Web Authoring Editor như
Dreamweaver còn Smarty thì thường là không (chưa gặp bao giờ). Ví dụ:
tự động phân tích cú pháp lúc coding để thông báo ngay lỗi syntax
error, code completion, code formatting, code highlighting, best
practice recommendator (unused declared variables, index existence
checking..)... Điều này tăng hiệu suất của người lập trình, giảm các
sai sót thường thấy, dễ debug, linh hoạt. Bạn sẽ không còn cần đến cửa
sổ debug của Smarty đó nhìn xem Smarty nó đã parse được những gì nữa.

mrphpvn

unread,
Sep 14, 2007, 1:18:20 AM9/14/07
to PHPVietnam
Bài phân tích của bạn khá hay, mình thừa nhận là mình ko chưa thử
nghiệm với các giải pháp template engine khác.
Thứ nhất việc phân tích ngôn ngữ của Smarty (quá trình dịch nó) ra các
mã PHP tôi thấy đâu có kết cấu phức tạp, nếu bạn đọc các file đã dịch
ra của smarty bạn hoàn toàn có thể hiểu rõ nó mà.
Thứ hai việc Smarty ko được các IDE hỗ trợ phân tích cú pháp lúc
coding thì ko phải ko có, có 1 số plugin cho Dreamweaver để giành cho
việc thiết kế template Smarty. Nó vẫn hiển thị lỗi bằng màu sắc giống
như việc bạn code thiếu 1 thẻ HTML. Tuy nhiên việc cần 1 IDE để hỗ trợ
việc tạo template thì tôi cho là ko cần thiết lắm, vì chung quy nó chỉ
là gắn các điều khiển vào HTML. Trong quy trình làm việc rõ ràng là
chúng ta đã có 1 file template dưới dạng HTML rồi sau đó mới thêm các
cấu trúc Smarty vào trong file HTML đó. Điều này có thể làm đơn giản
ngay cả = Notepad, Editplus, Emeditor,...
Thực ra mình ko bảo vệ Smarty cho lắm nhưng cách nghĩ mà những người
tạo ra Smarty mình cho là khá hay, nó tách biệt việc code với
template. Rõ ràng là nó phù hợp với mô hình MVC.
Và nếu bạn hiểu rõ từng chi tiết 1 của smarty thì bạn thấy là nó rất
thú vị và dường như mình ko cần phải dùng chức năng debug của nó để
xem khi bạn làm quen với nó nhiều rồi.
Về việc nó chậm mình chưa biết pcdinh đã thử nghiệm nó như thế nào? Mô
hình thí nghiệm ra sao?
Bạn có thể nói rõ hơn cho mọi người cùng biết hoặc đưa ra 1 ví dụ nào
đó được ko?
Và việc Smarty chỉ có tác dụng trong 1% dự án kiểu như bạn nói là thế
nào? Con số 1% là từ đâu ra, đã có thống kê chưa?

^_^

pcdinh

unread,
Sep 14, 2007, 3:23:14 AM9/14/07
to PHPVietnam
Trong 1 dự án làm Smarty, tôi đã phải dò từng dòng code của Smarty để
tìm ra một lỗi của nó, mà chính xác hơn là của PHP. Đến bây giờ lỗi đó
vẫn còn. Smarty luôn trả lại empty page khi quota được áp đặt và đã
vượt quá.

Các text code editor có hỗ trợ code hightlight nhưng không hoàn chỉnh.
Chúng không thể highlight theo block. Còn trường hợp syntax error là
trường hợp thường gặp nhưng đã gặp thì việc debug trên template gây
khó chịu hơn nhiều nếu không có IDE. Để phân tích syntax, người ta
phải xây dựng bộ thông dịch ngôn ngữ. Chưa có một IDE nào làm được với
Smarty. Nếu Smarty được viết bằng C thì điều này khả thi hơn. Giống
như Blitz.

Framework của tôi cho phép trừu tượng tầng View thành factory và
driver. Việc thử nghiệm với driver là Smarty và driver là Standard cho
thấy khâu biên dịch bị mất rất nhiều bộ nhớ: tăng từ 200% - 500% bộ
nhớ so với standard, CPU tăng khoảng từ 20 - 80% cao hơn so với
standard tùy theo việc bạn sử dụng vòng lặp phức tạp cỡ nào. Ngay sau
khi biên dịch xong, Smarty vẫn cần có lời gọi hệ thống stat để kiểm
tra sự thay đổi của template gốc. Stat là lời gọi rất tốn kém tài
nguyên. Và như thế nó đã làm giảm performance của compiled template so
với pure PHP template. Khi truy xuất I/O, PHP vẫn phải gọi stat call
nhưng riêng Smarty, nó cần thêm các lời gọi bổ sung để đảm bảo cho mô
hình của nó hoạt động.

Có 2 cách để thực hiện benchmark
+ Dùng microtime trước vào sau khi thực hiện render
+ Dùng microtime cho toàn bộ script cycle khi controller và model là
tối thiểu. Model có thể chỉ dùng một mảng đơn giản.

Để cho chính xác:
+ Gọi đơn lệnh để cho Smarty biên dịch và so sánh
+ Đặt vòng lặp 1 - 1000 cho cac lời gọi sau đó và tính tổng để so
sánh.

Debug trong Smarty ko đơn giản như ở template system. Debug không chỉ
là để đảm bảo cú pháp đúng mà còn là để đảm bảo dữ liệu đầu vào và
hiển thị đầu ra đúng. Về mặt cú pháp, bạn phải dùng mắt thường để ngó
xem bạn đã thiếu 1 cái { hay } ở đâu. Ngoài ra còn việc test dữ liệu.
Công việc này luôn gắn liền với cửa sổ debug của Smarty. Với template
system như PHPSavant thì chúng ta chỉ việc dùng var_dump() hay
print_r() nếu như nghi ngờ có độ vênh giữa Controller và View.

Việc debug dùng IDE là rất cần thiết. Nếu template của bạn đơn giản
thì nói chung giải pháp nào cũng như nhau vì sự khác biệt trong việc
đọc code ko chênh lệch. Tuy nhiên với các vòng lặp phức tạp (nested
loop) thường gặp trong các ứng dụng quản lý quy trình, bạn sẽ thấy sự
khác biệt lập tức. Người design thậm chí có thể populate dữ liệu mẫu
để test design template mà không cần biết tầng Controller và Model.
Nhưng với Smarty thì công việc khó chịu hơn nhiều đấy.

Như tôi đã khẳng định ở trên, Smarty không dẫn đến M-V-C. Vì có cùng
một mục đích nên PHPSavant hay các template system khác cũng vậy. Nó
chỉ tách logic, workflow và data layer ra khỏi vùng presentation giống
như cách tiếp cận tag soup của ASP.NET. Tuy nhiên sự phức tạp và lối
tư duy dùng một ngôn ngữ template dựa trên PHP để thay thế cho PHP,
vốn là một ngôn ngữ được thiết kế để là một ngôn ngữ template thì rõ
ràng là vô cùng có vấn đề. Python có TAL, Ruby có KML nhưng cả 2 ngôn
ngữ này cần dùng đến template engine vì chúng ko phải ngôn ngữ hướng
HTML. Chúng không thể nhúng. Vậy nên template engine như Smarty, KML,
TAL là cho các công nghệ loại này.

mrphpvn

unread,
Sep 14, 2007, 8:32:11 AM9/14/07
to PHPVietnam
Tôi đồng ý với ý kiến của bạn là rõ ràng dùng Smarty sẽ chậm hơn việc
dùng pure PHP. Nhưng 1 số điều:
1. Từ khi tôi quen và làm với smarty đến giờ thì tôi ko bao giờ cảm
thấy debug trên Smarty là khó khăn và cũng ít khi phải dùng đến cửa sổ
debug của nó. Và bạn hoàn toàn có thể debug thông qua chính browser
luôn khi thấy nó thông báo lỗi họăc kết quả hiển thị không đúng.
2. Các Syntax của Smarty tôi thừa nhận là phức tạp hơn so với các
engine khác tuy nhiên nếu bạn làm nhiều thì thấy rằng các cấu trúc
điều khiển của nó cũng rất là đơn giản, và không khó để có thể làm
quen. Bởi tôi đã cho 1 số bạn làm quen khi mới học với PHP tôi thấy là
cũng ko gặp trở ngại lớn lắm.
3. Việc compile của Smarty sẽ mất thời gian nhất cho lần chạy đầu
tiên, sau khi bạn thấy là dự án đã OK thì có thể đặt biến compile sang
chế độ ko biên dịch template nữa, và thế là từ lần sau trở đi Smarty
sẽ chỉ gọi các file trong thư mục comiple. Thêm nữa Smarty có hỗ trợ
cache khá tốt điều này chắc bạn hiểu sẽ nhanh hơn rất nhiều.

Về việc Savant như thế nào mình sẽ nghiên cứu xem, nhưng vừa qua đọc
trang chủ của nó mình cũng đọc đc 1 câu:
"The simple, elegant, and powerful alternative to Smarty."
"Savant is a powerful but lightweight object-oriented template system
for PHP."
"Savant is streams-aware and can use any stream as a template source."

Và search được 1 số site, (có thể các bạn đã biết):
http://cyberzoide.developpez.com/php4/template/
http://phpsavant.com/yawiki/
http://www.sitepoint.com/print/beyond-template-engine
http://en.wikipedia.org/wiki/Web_template_system
http://www.smashingmagazine.com/2006/10/01/html-template-systems-in-php/
http://www.codewalkers.com/c/a/Display-Tutorials/Writing-a-Template-System-in-PHP
http://www.nyphp.org/content/presentations/3templates/whynot/

> ...
>
> read more »

Reply all
Reply to author
Forward
0 new messages