Kişisel bir web günlüğü

Smarty gerçekten en iyi şablon motoru mu?

smartyŞablon motorları (template engines) sayesinde PHP kodları ile HTML kodlarını birbirinden ayırabiliyoruz ve bu sayede içiçe geçmiş, karmakarışık kodlarla çalışmaktan kurtuluyoruz. Ben genellikle en bilindik şablon motoru olan Smarty'yi tercih ediyorum. Geçen gün aynen Smarty sentaksı gibi sentaksı olan ama daha hızlı çalışan şablon motorlarının olup olmadığına baktım. Ve sonra Dwoo ve Template Lite isminde iki tane şablon motoru buldum. İkisi de Smarty'ye benzer sentaksa sahiptiler fakat maalesef ondan daha hızlı çıkamadılar.

Smarty, Dwoo ve Template Lite

smarty Smarty'yi fazla anlatmaya gerek yok aslında. En popüler ve geliştirilme süreci açısından en aktif olan şablon motoru. En son sürümü olan 2.6.26 sürümü, 18 haziran 2009 tarihinde yayınlanmış. Cache, filtre, plugin, modifier, debug gibi çeşitli özellikleri mevcut.

  1. <?php
  2.     $smarty = new Smarty;
  3.     $smarty->template_dir   = "./template/";
  4.     $smarty-> compile_dir   = "./compile/";
  5.    
  6.     $smarty->assign("isim",     "Erhan BURHAN" );
  7.     $smarty->assign("hobiler"array('müzik', 'fotoğraf', 'sinema'));
  8.    
  9.     $smarty->display('anasayfa.tpl');
  10. ?>

  1. <p>Merhaba {$isim}</p>
  2. <ul>
  3. {foreach from=$hobiler item=item}
  4.     <li>{$item}</li>
  5. {/foreach }
  6. </ul>

dwoo dwoo.org adresinden erişebileceğiniz Dwoo yalnıca PHP 5 sürümünde çalışıyor ve bu sayede PHP 5'in nesne yönelimli programlamada sunmuş olduğu avantajlardan faydalandığını belirtiyor. Smarty’ye oldukça yakın (hatta daha da basit) bir sentaksı var. En son sürümü olan 1.0.1 sürümü, 24 aralık 2008’de yayınlamış. Plugin, cache, modifier gibi özellikleri var.

  1. <?php
  2.     $dwoo = new Dwoo();
  3.     $tpl  = new Dwoo_Template_File('./template/anasayfa.tpl');
  4.     $data = new Dwoo_Data();
  5.    
  6.     $data->assign("isim",    "Erhan BURHAN" );
  7.     $data->assign("hobiler"array('müzik', 'fotoğraf', 'sinema'));
  8.    
  9.     $dwoo->output($tpl, $data);
  10. ?>

  1. <p>Merhaba {$isim}</p>
  2. <ul>
  3. {foreach $hobiler item}
  4.     <li>{$item}</li>
  5. {/foreach }
  6. </ul>

Template LiteEski adı "Smarty Light" olan bu şablon motoru Smarty’den daha hızlı olduğunu ve daha az bellek kullandığını iddia ediyor. En son sürümü olan 2.10 sürümü, 4 Ocak 2007 tarihinde yayınlanmış (geliştirilmesi durdurulmuş görünüyor). templatelite.sourceforge.net adresinden erişebileceğiniz bu şablon motorunun özellikleri ve sentaksı Smarty'ye çok çok yakın.

  1. <?php
  2.     $tpl = new Template_Lite;
  3.     $tpl->template_dir  = "./template/";
  4.     $tpl->compile_dir   = "./compile/";
  5.  
  6.     $tpl->assign("isim", "Erhan BURHAN" );
  7.     $tpl->assign("hobiler"array('müzik', 'fotoğraf', 'sinema'));
  8.    
  9.     $tpl->display('anasayfa.tpl');
  10. ?>

  1. <p>Merhaba {$isim}</p>
  2. <ul>
  3. {foreach from=$hobiler item=item}
  4.     <li>{$item}</li>
  5. {/foreach }
  6. </ul>

Derleme süreleri ve Bellek kullanımları

Burada bahsettiğim üç şablon motoru da kendisinin en hızlı ve belleği en az kullanan olduğunu söylüyor. Ben de bu iddalara karşın, kendi bilgisayarımda küçük ve basit bir test uyguladım. Bu testi her şablon motoru üzerinde ayrı ayrı 15’er kez uyguladım. Bu testte bütün şablon motorları yaklaşık 100 KB’lık tpl dosyasını alıyorlar, bu dosyaya 10000 adet veri ataması yapıyorlar ve aldıkları bu tpl dosyasını derleyerek (compile ederek) çıktıyı ekranda gösteriyorlar. Derlenen dosyanın boyutu da 2.8 MB’ı buluyor.

test süreci

Test sonucunda elde ettiğim verileri ise aşağıda görmüş olduğunuz grafiklere aktardım. Tpl dosyalarını en hızlı derleyen Smarty oldu. Template Lite ise derleme işlemini diğerlerine göre çok daha yavaş gerçekleştirdi. Bellek kullanımı konusunda ise en iyi değeri veren Template Lite oldu. Onun hemen ardından Smarty geldi. Dwoo ise diğer ikisinden çok daha fazla bellek kullandı.

süreler
bellekler

Sonuç

Burada uyguladığım testin oldukça basit olduğunu bir kere daha söylemek istiyorum. Zira test ettiğim şey yalnızca veri ataması (assign) ve tpl dosyasının derlenme (compile) süresi... Zaten şablon motoru kullanırken de benim en sık yaptığım şey, veri ataması ve derleme işlemidir. O yüzden testi yalnızca bu işlemlerle sınırlı tuttum. Siz daha detaylı testler yapabilirsiniz. Eğer yaparsanız da sonuçları paylaşırsanız sevinirim. Sonuç olarak ben Smarty kullanmaya devam edeceğim ;)

NOT 1: test süresince elde ettiğim değerlere buradan ulaşabilirsiniz.

NOT 2: test için kullanılan dosyalara şuradan ulaşabilirsiniz.

20 Haziran 2009, 12:05 Programlama Bugün 2 kez, toplamda ise 3.505 kez okundu. , , , , ,
24 yorum var
  1. Çok güzel bir konuya değinmişsin, eline sağlık!

  2. Teşekkür ederim.

  3. çok kaliteli bir yazı olmuş özellikle test sayfası müthiş teşekkürler…

  4. Smarty ile ilgili Türkçe kaynak sıkıntısı var sanki. Pek kayda değer bir döküman bulamadım.

  5. Çok güzel bir test olmuş.

  6. @Utku
    Smarty’ye giriş videosu: http://rapidshare.com/files/51410245/smarty.rar.html
    Smarty kullanma klavuzu: http://www.box.net/shared/g43p6iyfaj
    Smarty template motoru ve PHP: http://www.gurkanoluc.com/smarty-template-motoru-ve-php
    Php, Smarty ve Adodb İle Rss Feed Hazırlamak: http://www.2nci.com/lab/detail/php-smarty-ve-adodb-ile-rss-feed-hazirlamak

    @Mehmet Fatih YILDIZ
    teşekkür ederim.

  7. Çok güzel bir yazı olmuş teşekkürler.
    Şunu sormak istiyorum. Yazılarını codeigniter mail listelerinde görüyorum. Codeigniter’ın içinde template motoru var. Onu kullanmak yerine yinede smarty kullanmalı mıyız?
    NOT: Codeigniter’la da ilgili yazılar yazarsan çok güzel olur.
    Kolay gelsin

  8. @SNaRe
    CodeIgniter ile ilgili sorularını gruba sorarsan daha iyi olur. Bu seferlik buradan cevap yazıyorum.

    Ben CI kullandığım zaman asla Smarty kullanmıyorum. Çünkü CI’nın kendine has bir “view” katmanı var ve şablon dosyaları içerisine saf PHP kodları yazıyorsun. Bu da son derece hızlı ve yeterli bir yöntem.

    Bunun yanında CI “Template Parser” sınıfına sahip ama oldukça basit bir sınıf bu. Zaten kendileri de maksimum hız sağlamak amacıyla bu sınıfı basit tuttuklarını söylüyorlar. Bu sınıfı da “olur da eğer saf Php kodlarını bilmeyen bir tasarımcıyla çalışırsanız” diye yazmışlar. Buradan yola çıkarak, sen de çok iyi Smarty bilen bir tasarımcıyla çalışmadığın sürece Smarty’yi CI’ya entegre edip kullanmanı gerektirecek bir neden yok.

  9. http://dwoo.org/ daki template inheritance özelliği güzel. Benim bildiğim Django stilinde H2O template motoru var bide.

  10. çok iyi bir yazı olmuş , smarty çekirdek gibi bir kere kullandınız mı bir daha bırakamazsınız :)

  11. Ben bu konuda sadece MVC diyorum. Smarty tecrubem olmadı bu sozu söylemek icin ama MVC yontemiyle HTML i PHP ile en minimal sekilde birbirine karistiriyorum . Bi dünya kod yigini gereken bi ortama ihtiyac duymuyorum …

  12. Hüseyin Berberoğlu Katılıyom ;)

  13. @Omer
    Smarty zaten MVC’nin View ayağı oluyor bir nevi…

    @Cihad
    Teşekkür ederim. H2O’ya bakacağım…

  14. Gerçekten güzel bir karşılaştırma olmuş, fakat uygulamalarda pratik olarak, template dosyalarında bir değişim söz konusu olduğunda, bir seferlik çağırılan derleme sürecindense, derlemeden sonra, trafiğe göre yüzlerce kat daha fazla çağırılan yorumlama süresi daha önemli gibi geliyor. Nitekim bu aynı zamanda derlemenin ne denli verimli, yorumu kolay ve hızlı yapıldığının göstergesi, ve karşılaştırmaya katılan şablon motorlarının gerçek ‘hız’ iddiasının temelinin bu olduğunu zannediyorum.

    Test dosyalarını yazıda paket olarak (tar, zip, vb) paylaşabilirsen, karşılaştırma boyutunu genişletmek isteyen diğer insanlar gibi, benim de http istek karşılaştırması (http request bm) yaparak yorumlama hızlarını eklememi kolaylaştırır.

    Teşekkürler

  15. @Gökçe YALÇIN
    Öncelikle yorumun için teşekkürler. Yukarıdaki 15 adımlık testin 1. ayağı derleme süresini, diğer 14 ayağı ise yorumlama süresini gösteriyor. Yazının sonuna (NOT 2) test dosyalarını indirebileceğiniz bir link ekledim. Farklı kişilerden farklı test sonuçları gelirse, daha sağlıklı bir sonuç elde edebiliriz. Bu yüzden ayrıca teşekkürler.

  16. Template sistemlerine her zaman sevmem nedenini bilmiyorum.
    Bu yüzden kendim bir şeyler yazıyorum genelde.

  17. Smarty bence mükemmel. Yeni scriptlerimin tümünde Smarty kullanıyorum. Kod ile Tasarım mükemmel bir biçimde ayrışınca eski projeye tekrar döndüğümde hiç zorluk çekmiyorum. Zend, Codeigniter v.s ilede takıldım ama bu frameworkler bana sanki yeni bir dil öğreniyormuşum gibi geliyor. ci ayrı tabi :) oda oldukça sade.

    Kendi classlarım + fonksiyonlarım ve Smarty ile kardeşçe ilerliyoruz bakalım :)

    yazı için teşekkürler. Neden videolu anlatımlar yapmayı düşünmüyorsunuz? Önüne gelen video çekiyor? Bu tarz konularda videolu sunumlar gerçekten çok hoş olur düşüncesindeyim. Mesela Türçe mod_rewrite ile url yönlendirme ve sef link yapımı ile hiçbir sağlam döküman yok diye biliyorum. Sadece sef fonksiyonları geziyor ve parça parça bilgiler.

    Çalışmalarınızda başarılar.

  18. Ben de ozgurOs gibi ilerliyorum. Ancak yeni başladım bu ayrıştırmalı çalışmaya. Veritabanı işlerinde ezSQL ile işlerimi hallediyorum. Arayüz kısmını da Smarty ile halletmeye çalışıyorum. Belli div’lerin içine belli verileri koyup, table’ların içine de listelemede kullanıyorum. Sizde benim için şu an en kolayı olan bu yoldan iyisi ve katkısı olacak bir yöntem var mı? CI ne kadar kullanışlı bu konuda?

  19. guzel yazı sağolun..

    Ancak ben daha yeni başlıyorum ve Zend ‘e smarty yi entegre etme konusunda baya zorluk çekiyorum. Bildiğiniz bir kaynak varmı TR/EN farketmez. ZF 1.8 uyumlu olursa sevinirim.
    teşekkurler

  20. Smarty kullanım kılavuzu bana epey karışık geldi. Cahilliğime verin; şu 14. sayfadan itibaren başlayan $foo ibareleri ne işe yarıyor?

  21. @Gökhan $foo ve $bar ismindeki değişkenler sadece örnek için kullanılıyor. İsimlere takılma yani o değişkenlerin aldığı değerlere yada kullanımlarına göz at.

    örneğin bir veritabanı için test aşamasında değer girerken nasıl lorem inspur v.s giriyorsak o isimlerde o şekilde.

    *********************************************************************

    frameworklerde zaten viewler var. smarty neden entegre etmek istiyorsunuz cache içinmi?

  22. Hem türlü türlü framework, hem template engine – smarty kullanmış biri olarak, her ikisinin ayrı ayrı – ve bazen ikisinin de bir arada kullanılarak avantaj getirdiğini söyleyebilirim. Smarty’nin cache sistemi olsa da, frameworklerde çıktının değil, verinin geniş olanaklarla ve sürücülerle (sqllite, db, memcache) cachelenmesi daha doğru kabul ediliyor.

    Buradaki artılar, aslolarak herhangi bir iyi şablon motoru için de geçerli:

    1) Standardizasyon. Tasarımcılar, bir şablon motoru kullanımına alışmış olabilirler ki çoğu benzer bir syntax kullanır, büyük projelerde ZF’nin View ‘una yanında mutlaka Smarty istenmesinin birincil önceliklerinden biri buydu.

    2) Alışmışlık ve kolaylık. Smarty’nin blockları, modifierları ve blockları, ve genişletilebilme kolaylığı herhangi bir frameworkün view helplarından çok daha üstün durumda. Bu yadırganacak bir şey değil, nitekim framework topyekün uygulamaya göz kulak olurken, bir şablon motorunun ana görevlerinden biri bu.

    3) Güvenlik. Tasarımla ilgili kısmın, backendden tamamen ayrıldığı ve yorumlandığı, özet olarak PHP olmayışı, görevlere ayrılmış takımlarla iş yapanlar için bir güvenlik unsuru taşıyor. İşin özünde uygulamanın içinde doğrudan PHP kodu çalıştırılmasına izin vermeyebiliyoruz. Zend Framework’ü katı kurallarla çevreleyerek View’da PHP çalıştırılabilse bile sınıfların kullanımlarına yasaklar getirmek mümkün, fakat smarty kullanmayı seçmeye göre çok daha uğraştırıcı ve olası hatalarda geçilebilecek bir iş. Erişim güvenliğinin kesin çözümü, adama manüple edebileceği hiç bir arayüz vermemek.

    Açıkçası benim framework deneyimlerimde, cakePHP haricinde her frameworkün view’u smarty kadar olamadı. Fakat maalesef cakePHP’nin de geri kalanıyla anlaşamadım.

    Tabii bunlar benim tecrübelerim, bu böyledir diye bir kaide yok, fakat framework varken niye smarty sorusuna vereceğim cevap bu.

  23. Ek olarak:

    4) Hata kontrolü. Web tasarımcılığı bir zamanlar öyle olsada artık grafik layoutları düzenlemekten ibaret değil, artık arayüz programlamayı da büsbütün içerir oldu. Fakat tam olarak uygulama programlaması da yapmadıklarından, onlar için daha üst seviye, sadece bu işe bakan bir syntax geliştirmesi son derece makul. Nitekim PHP’nin C’den ayrılma nedeni de bu, özel işe, özel araç. Bu sayede, yapılan HTML hatalarının dahi görülmesi ve sistem hatası almadan ( PHP sistem hatası ) yapılan şablonun düzgün yorumlanıp yorumlanmadığını görerek yayına sunacak aşamaya getirilmesi sağlanabiliyor. Tabii ki bu maddeler 1 kişilik değil, dış kabuğun ve uygulamanın ( frontend ve backend ) ayrı takımlarca çalışıldığı projelerde geçerli.

  24. Çok güzel bir konu ve yorumdaki video/kullanım klavuzu paylaşımları da bir o kadar güzel oldu. Hatta onları konuya dahil ederseniz bence çok daha güzel olacaktır (Tabi siz ben Smarty için daha ayrıntılı bir makale hazırlayıp orada vereceğim bunları derseniz tadından yenmez bir makale olacağına eminim:) ).

    Başarılar..

İçinizde kalmasın, siz de yorum yazın

Telif Hakkı © 2010 eburhan.com | Structure | XHTML