テンプレート
エンジン Smarty - PHP
の詳細な紹介: cjjer
より
MVC 開発モデルのロジック層とプレゼンテーション層を実装するために PHP を使用するためにいくつかの変更を加えました。さまざまなテンプレート エンジンから選択できますが、誕生後は選択できます。公式エンジンSMARTYの選択は変わりました。そのコンセプトと実装は非常に前衛的です。この記事では主に、他のテンプレート エンジンと比較した SMARTY の異なる特性について説明し、エンジンのインストールと使用法を簡単に紹介し、小さなテスト ケースを使用して SMARTY と PHPLIBtemplate の速度と使いやすさを比較します。
1. MVC にはテンプレートが必要です。MVC
は、SmallTalk 言語の開発プロセス中に、それぞれモデル、ビュー、コントロールを表す設計パターンとしてまとめられました。その目的は、大規模および中規模のさまざまな開発役割がそれぞれの役割を実行できるようにすることです。プロジェクト。ネットワーク アプリケーションの開発では、次の図を使用して概念間の関係を表すことができます。
この図は単純な WEB アプリケーションを示しています。ユーザーがブラウザーで見る情報はデータベース サーバー上のコンテンツですが、事前にアプリケーション サーバーによって処理されています。開発者は、データ構造、データ処理ロジック、データ表現方法を確立する責任があります。
1996 年に中国で CGI が普及したとき、初期の WEB プログラマーはすべて HTML を独学で学びました。しかし、ネットワークの速度が段階的に向上するにつれて、ページ サイズも増加しました。元は 20 ~ 30 K でしたが、10 倍に跳ね上がりました。 CGI プログラムを作成すると、PERL ソース コードと HTML ソース コードを分離するという緊急の要件が生じます。このように、社会の進歩は開発チーム内の分業に反映されます。アーティストとプログラマーはお互いの仕事にあまり精通していないため、協力中にコミュニケーションをとるために合意された言語を使用する必要があります。
この言語は私たちの母国語でも英語でもありません。この用語はテンプレートと呼ばれ、ロジックとプレゼンテーションはテンプレートに依存します。 HTMLとスクリプト言語の特徴を組み合わせた表現方法です。このようにして、プレゼンテーション層はロジック層で処理されたデータをユーザーが希望する形式で表示することができます。 Windows プラットフォームでの MFC 開発経験がある場合は、Document/DocumentTemplate/View のカプセル化に精通しているはずです。これは非常に典型的な MVC の例です。 Web アプリケーションに関しては、個人的には J2EE の EJB/サーブレット/JSP が最も強力であると考えています。もちろん、シンプルで美しい Structs もあります。もう 1 つのよく知られた実装は、COM/DCOM+ASP です。この組み合わせは、我が国のほとんどの人に使用されています。
WEB アプリケーションでのいくつかの MVC 実装を比較することで、テンプレートに関する概念を得ることができます。テンプレートとは、HTML に挿入される一連のスクリプト、またはスクリプト HTML であり、挿入されたコンテンツはデータの変更を表します。以下はテンプレート ファイルの例です。処理後、このテンプレートはブラウザーに Hello, world! と表示されます。
$greetings
の処理方法については、比較のために後述するのでここでは省略します。
2. SMARTY を選ぶ理由
PHP には、初期の PHPLIBtemplate や新星である Fasttemplate など、数多くのテンプレート エンジンがあり、いくつかのアップグレードを経て、非常に成熟し、安定しました。現在使用しているテンプレート エンジンに非常に満足している場合は、続きを読んでください。フリー ソフトウェア愛好家、または効率性と優雅さを追求する開発者として、次の SMARTY の紹介は多少興味深いものになると思います。
個人的な好みの影響に加えて、私は常に APACHE の XML エンジン Axis などの公式の標準実装を使用する傾向がありました。利点は、可能な限り最高の互換性が得られることです (たとえば、初期の MFC と Win3x の互換性は他のアプリケーション フレームワークよりも優れていました。もちろん、現在ではすべてのバージョンが非常に完成しています)。 SMARTY がリリースされる前は、PEAR の Integrated Template eXtension を使用していました。このエンジンは、テンプレートの構文からテンプレートの処理に至るまで、PHPLIBtemplate および Fasttemplate とほぼ互換性があり、テンプレートがメモリに読み込まれてから、parse() 関数が呼び出されて、プリセット タグがデータに置き換えられます。
SMARTY がどのように行うかを見てみましょう。リクエストを受信した後、まずその URL が初めてリクエストされたかどうかを判断し、その URL に必要なテンプレート ファイルを php スクリプトにコンパイルします。そうでない場合は、その URL のテンプレートが既にリクエストされていることを意味します。再コンパイルせずにすぐにリダイレクトできることを確認します。デフォルトでは、テンプレート ファイルが変更されます。
どうでしょうか?そういえば──これがJSPの原理じゃないですか!確かに、この種のコンパイルは、PHP のような解釈されたスクリプト エンジンで使用すると信じられないほど素晴らしいように思えますが、よく考えてみると、JAVA も JVM によって解釈され、実行されるのではありませんか?これは、不可能なことは何もなく、ただ想像できないだけであることを意味します。
JAVA について話したところで、PHP の将来について私の意見を述べさせてください。 PHP の公式 Web サイトは、バージョン PHP 5.0 が 2003 年末にリリースされると発表しました。このバージョンには、例外処理、名前空間、よりオブジェクト指向など、多くの新機能が含まれています。 JAVA に近づいていると言えます。SMARTY も新機能の 1 つであり、PHP は大規模および中規模のプロジェクトの開発により適しています。しかし、最初にそれを選んだ理由、つまり柔軟性と使いやすさからはどんどん遠ざかっているように思えます。しかし、ソフトウェアのライフサイクルの観点から見ると、PHP は成長段階にあり、開発者にとってはメリットがデメリットを上回っており、商用アプリケーションに対応できることを期待して、より多くの機能を追加する必要があります。 PHP の忠実なユーザーとして、PHP の機能が不十分であると常に非難されることは望ましくありません。
JSP に似ているという理由だけで、なぜ SMARTY を選ぶのでしょうか?確かにもっと良い理由があります。まず、最初のコンパイルのコストが比較的高いことに加えて、テンプレート ファイルが変更されない限り、コンパイルされたキャッシュ スクリプトがいつでも利用できるため、parse() 時間が大幅に節約されます。 PHP のような豊富な関数ライブラリ。単語のカウントから自動インデント、テキストの折り返し、正規表現など、データの結果セットのページング表示機能が必要な場合に直接使用できます。強力な拡張機能も備えており、プラグインを通じて拡張できます。
事実は言葉より雄弁です。テストプログラムを設計し、速度と開発難易度の 2 つの要素に基づいて SMARTY と PHPLIBtemplate を比較しました。PHPLIBtemplate を選択した理由は、Patrick の記事「Choosing the Most Ideal Template in the PHP World」に PHPLIB の比較があるからです。 template と Fasttemplate の競争では、PHPLIBtemplate が大勝利を収め、SMARTY が好敵手となりました。テストする前に、インストール プロセス中に注意する必要がある問題について説明します。
3. 発生する可能性のある問題
SMARTY の公式 Web サイトには詳細なユーザー マニュアルがあり、HTML および PDF 形式のオンライン バージョンを選択できます。ここではマニュアルの既存の内容については説明しませんが、最初の使用時に発生する可能性のある問題についてのみ説明します。
最初の質問は非常に致命的です。必要なファイルが見つからないということです。誰もが SMARTY のデフォルトのディレクトリ構造に従ってアプリケーションを作成するわけではありません。これは手動で指定する必要があります。ディレクトリ構造は次のようになります
。index.php でディレクトリ構造を指定する必要があります。
$smart->template_dir = "smarty/templates/";
$smart->compile_dir = "smarty/templates_c/";
$smart->config_dir = "smarty/configs/";
$smart->cache_dir = "smarty/cache/";
最初の問題は解決されましたが、次に 2 番目の問題が発生します。なぜ、Dreamweaver で生成したばかりの美しいテンプレートが使用できないのでしょうか。テンプレート ファイルに問題があるわけではありません。SMARTY のデフォルトのタグ区切り文字が {} であり、残念なことに Javascript にはこのタグが確実に含まれているためです。幸いなことに、区切り文字として任意の文字と次の 2 つの文を使用できます。
$smart->left_delimiter = "{/";
$smart->right_delimiter = "/}";
これでインストールは基本的に完了しました。問題ありません。
4. 対比と類推
まず、テストのデザインについて考えます。主な判断要素はもちろんスピードです。速度テストでは、算術平均が使用されました。テスト ページでページ生成を N 回繰り返し、合計ページ生成時間を比較します。もう 1 つの重要な要素は使いやすさです (スケーラビリティに関しては、結果を比較する必要がありません)。そのため、使用するテンプレートが小さすぎることはできません。私は個人のホームページのページを使用しています。これは Firework+Dreamweaver で生成された HTML ファイルで、サイズは約 7K です。変数設定には、最も一般的に使用されるブロック (PHPLIB テンプレートではブロックと呼ばれ、SMARTY ではセクションと呼ばれます) も採用されています。名前の違いを過小評価しないでください。使いやすさの基準は 2 つの部分に分かれています。それは、テンプレート ファイルとスクリプト ファイルの構文が簡潔で使いやすいかどうかです。
テストに移りましょう。まず、2 つのテンプレート ファイルの構文を見てみましょう。青いバーの左側は PHPLIB テンプレートで、右側は SMARTY に属します。個人の好みはさまざまなので、ここではコメントしません。スクリプト内の処理ステートメントの比較に重点を置き、まず PHPLIB テンプレートを確認します。
$tpl->set_file('phplib', 'bigfile.htm');
$tpl->set_block('phplib', 'row', 'rows');
for ($j = 0; $j < 10; $j++){
$tpl->set_var('tag' ,"$j");
$tpl->parse('rows', 'row', true);
}
$tpl->parse('out', 'phplib');
$tpl->p('out');
以下はスマートです:
$smart->assign('row',$row);
$smart->display('bigfile.htm');
SMARTY はタグと行の 2 つの変数のみを使用しますが、PHPLIB テンプレートには追加のテンプレート ファイル ハンドラーと不可解な出力があります。正直に言うと、最初にこのアウトが存在する理由がわかりませんでしたが、今でも違和感があります。 SMARTY の処理ステートメントが非常に少ないのはなぜですか?答えは、仕事はエンジンによって行われるということです。ソース プログラムを詳しく調べたい場合は、Smarty_compiler.class.php に _compile_tag() という関数があることがわかります。この関数はセクション タグを PHP ステートメントに変換します。通常のラベルとは異なり、パラメータやデータが用意されているため、スクリプトプログラミングの負荷が軽減されます。使いやすさでは、SMARTY の方が優れていると判断できます。
次は速度に焦点を当てる番です。結局のところ、熟練した Web 開発者にとって、テンプレート エンジンは言うまでもなく、最も困難なツールを習得するのは時間の問題です。テンプレート エンジンは、学習曲線が緩やかなテクノロジーです。速度は Web アプリケーションの命であり、特に同時アクセス数が多いサイトでテンプレート エンジンが使用されている場合には、さらに重要になります。テストが始まる前は、何度もアップグレードされており、基本的にバグがないため、この点では PHPLIB テンプレートが勝つだろうと思っていました。また、ファイルが 2 つしかない相手とは異なり、SMARTY のエンジンは大きすぎます。
案の定、テスト結果は以下のとおりで、PHPLIB テンプレートには 25% の速度の利点があります。
しかし、常にこのようになるわけではありません。もう一度更新を押したところ、今度は異なる結果が得られました。
PHPLIBは基本的には変わっていないが、SMARTYは25%高速化している。更新を続けると、2 回目と同様の結果が得られます。SMARTY は PHPLIB テンプレートよりも 10% 近く高速です。これが、コンパイルされたバージョンがインタープリタされたバージョンよりも高速である理由だと思います。 SMARTY エンジン自体は非常に大きく、テンプレートを php ファイルにコンパイルする必要があるため、速度は確かにコンパクトな PHPLIB テンプレートほど速くありません。しかし、これは初めての場合に限ります。 2 回目のリクエストを受け取ったとき、SMARTY はテンプレートがすでにコンパイルされていることを発見したため、最も時間のかかるステップがスキップされ、相手は検索と置換を段階的に実行する必要がありました。これは、編集の原則で述べた「空間と時間の交換」の典型的な例です。
5. 結論 結論
としては、SMARTY に夢中になったら、何を待っているのでしょうか?もちろん、これが万能であるという意味ではありません。MVC モデルを使用して個人の Web サイトを作成する場合と同様、作業負荷が軽減されないだけでなく、異なるレベル間の結合について常に考慮する必要があります。
SMARTYが適していないものは何ですか?マニュアルにある典型的な例として、天気予報 Web サイトを取り上げます。もう一つ思い出されるのは株式市場です。この種の Web サイトで SMARTY を使用すると、再コンパイルが頻繁に行われるため非効率になるため、PHPLIB テンプレートの方が適しています。
この記事は 2 つのエンジンを比較するものではなく、SMARTY の利点を説明するものです。これを使用する上で最も意味があるのは、これが新しい PHP システムの一部として、.NET と JAVA ONE の 2 つの主要なシステムに加えて、大規模および中規模の Web 開発のための他のオプションがあることです。 GNU プロジェクトにとって、その重要性は、劉氏と鄧小平の軍隊が数千マイルをデービー山脈に飛び込むのと何ら変わりません。
著者: ユウ・ボクシアン