phpのテンプレートエンジンtwigとは

December 31, 2009 - PHP

最近、PHPのテンプレートエンジンTwigの紹介記事をちらほら見かけるようになってきました。
自分自身も気になってはいたのですが、試してみるきっかけがなく今に至ってしまいました。現在のプロジェクトではviewは関わらないのですが、それまではSmarty2を使っていました。Smarty3や他テンプレートエンジンも気になるところですが、次はTwigがくるだろうと勝手に予測しています。
とりあえず今回はTwigの特徴と他テンプレートエンジンとの比較をまとめてみます。

Twigの特徴

公式サイトから英訳(適当に)してみました。

  • 簡潔に書ける
  • テンプレート指向文法である
  • 自動エスケープなど必要なものをすべてサポートしている
  • 文法を簡単に学習できる(※他テンプレートエンジンはPHP4ベースで作られていたりして、web開発においてベストプラクティスとして採用できない。)
  • 高い拡張性で独自DSLも作れる
  • ユニットテストされているのでライブラリは堅牢で、大きなプロジェクトにもすぐに使える。
  • ちゃんとドキュメント化されている:
  • セキュリティでは自動出力エスケープやsandboxモードによって安全性を確保
  • 詳細なエラーメッセージでデバッグもカンタン
  • テンプレートを素のPHPコードにコンパイルするので、普通のPHPコードに比べてオーバーヘッドを最小限に抑えることができる。

開発者について

Symfony開発者でもあるFabienのブログ記事(とそのフォロー記事)を見れば、開発の経緯や他テンプレートエンジンとの比較、それからPHP自体テンプレートエンジンじゃないかという点について言及しています。
素のPHPをViewとして使いたい人はSymfonyTemplateComponentがスタンドアロンで動作するのでそれを使うと良いと。ViewでPHP的な文法を用いることに疑問を持っていたようです。

既存テンプレートエンジンとの比較

もともと彼は以下機能を求めてテンプレートエンジンを探していたので、この観点でそれぞれのテンプレートエンジンを評価しています。(なのでこれがそのままTwigの特徴になっています。)
  • Concision (記述が簡潔)
  • Template oriented syntax (テンプレート指向な文法)
  • Reusability (再利用性)
  • Security (安全性)
  • Sandbox mode (砂場モード)
Smarty:Smarty3で機能要求を満たしているものの、パフォーマンスが悪い。
PHPTAL:よく設計されていて、機能もあるが、webデザイナにはとっつきにくく、テンプレートの継承的なことは特にそう。
ezComponents Template:よく設計されていて、多くの機能を持つが、継承をサポートしていないのと、パフォーマンスが他よりかなり劣る。
Dowoo:Smartyの代替プロジェクトとしてSmartyを真似てつくられていて、継承などの新機能も追加されている。パフォーマンスもSmartyより良いけど、sandboxがないのと、コアシステムの拡張性が十分でない。
Calypso:DjangoのPHPクローンだけど諸問題により開発停止している。

ベンチマーク

既存のテンプレートエンジンに関するベンチマーク結果です。

ベンチマーク方法

  • 3つのアイテムをループさせ、シンプルな装飾のレイアウト出力の比較。
  • 10000回表示するテストを10回実行した平均値。
  • 継承はヘッダとフィッタを代わりに使用。
  • 自動出力エスケープができないものは手動でエスケープ処理。
  • コマンドラインでPHPAcceleratorなどを使用しない環境で実行

処理時間とメモリ消費

Library Time (sec) Memory (Ko) Templates rendered per second
Twig 3 1,190 3,333
PHPTAL 3.8 2,100 2,632
Dwoo 6.9 1,870 1,449
Smarty 2 12.9 2,350 775
Smarty 3 14.9 3,230 671
Calypso 34.3 620 292
eZ Templates 53 5,850 189

コンパイル後のメモリ消費

※フォロー記事の方がSmartyの数値が妥当らしいのでそっちを引用しています。

Library Time(sec) Memory without compilation (Ko)
Plain PHP 2.4 114
Twig 3 383
PHPTAL 3.8 598
Dwoo 6.9 1,645
Smarty 2 12.9 610
Smarty 3 14.9 799
Calypso 34.3 614
eZ Templates 53 2,783

まとめ

機能性だけでなく速さも兼ね備えたテンプレートエンジンTwig。
便利なテンプレートエンジンはSmartyがデファクトでしたが、Twigはそれを追い抜くかもしれませんね。
Symfony2.0でオプションのViewとして用意するかも、とFabienは個人的見解として言っているので、そうなると日本語圏でも利用が加速するかもしれません。ただ、Symfony2.0はPHP5.3以上必須なのでPHP5.3への移行に依存しますかね。Smarty3が正式リリースまでにどこまでパフォーマンス改善してくるかも楽しみなところです。

Smartyから乗り換える場合はプログラマよりデザイナの移行コストが高いと思われるのですが、それがクリアできるならぜひ移行してみたいですね。素のPHPよりは断然読みやすく理解しやすですし。

次は機能的なところをまとめたいと思います。