Facebook XHP。 オブジェクトテンプレート

Facebookは2010年2月にXHPを発表したという事実にもかかわらず、このテンプレートエンジンに関する情報はまだほとんどありませんが、アイデアとしてもXHPは非常に興味深いものです。



この記事では、主な長所と短所であるXHPの概要を簡単に説明し、パフォーマンスの問題についても触れます。





XHPは、言語構文を補完するPHP拡張機能であり、一方ではフロントエンドコードの認識を向上させ、もう一方ではXSS攻撃の回避に役立ちます。 [1]






それでは、HTML(XML)マークアップを少し出力するには何が必要ですか?


失礼な場合、以下が必要になります。

//  HTML $html = '<div id="mydiv"><p>, !</p></div>'; echo $html;
      
      







XHPを使用した同じこと:

 $html = <div id="mydiv"><p>, !</p></div>; echo $html;
      
      







または:

 $html = new :div(array('id'=>'mydiv',), new :p(array(), ', !')); echo $html;
      
      







これらの例の後、XMLがXHP拡張機能によってhtml要素を記述する特定のクラスに変換されることがすでにほとんど明らかになったと思います。

これは、概して、XHPテンプレートエンジンの全体的なポイントです。 現在、「string HTML」を使用していません。 各ノードは独自のプロパティを持つオブジェクトであるため、「完全に」という言葉から。



すべてに加えて、ユーザー生成コンテンツはすべてエスケープされます。 html要素以外の子についてhtmlspecialcharsが自動的に処理されます。 はい。データベースから受け取ったコンテンツもデフォルトでエスケープされます。信じてください。



PHP:

 $html = "<div>{$_POST['xss_content']}</div>"; //  
      
      







XHP:

 $html = <div>{$_POST['xss_content']}</div>; // 
      
      







XHPの性質から来るもう1つの機能は、組み込みのHTML検証(XML)です。 この方法でクラスをインスタンス化することはできません。

 $html = new myHtml(;
      
      





そのため、html要素は閉じられたままにできません。ネストが正しくありません(短いタグがサポートされています)。



短所について




上記のスキームの明らかな唯一の欠点は、そのプラスの流れが何であるかです- 各要素はオブジェクトです。

したがって、2000個のネストされたタグのレイアウトは、2000個のネストされたオブジェクトです。



出力で得られるものは明確です:





メモリ消費量の増加がこの記事の大部分に影響することはありません。なぜなら、 XHPオブジェクトは非常に単純で、プロセスに大量のメモリが割り当てられます(640キロバイトですべての人に十分です)。

ただし、多数のネストされたオブジェクトを作成し、XHPマークアップをオブジェクトに変換すると、レンダリング時間が長くなります。 質問はいくらですか?



幸いなことに、2010年の誰かが、 ラスマスラードルフがXHPとPHPネイティブの「発射速度」の比較分析を行い、次の結果を受け取りました[2]。







かなり前のことであり、テストはやや合成的であり、乏しいHTMLフラグメント(フォーム)が生成されたため、 HHVMで比較テストを実行する必要があると判断しました(XHPサポートは、PHPの場合は別個のモジュールを作成する必要があります)。



残念ながら、すべてのXHPクラスの説明はphpファイルに残っています(Rasmusは、基本クラスの宣言をコンパイル済みモジュールに転送することでパフォーマンスの低下の問題を部分的に解消できると書いています)。Hackの場合、著者は<?Phpを<?Hh / / decl、したがって、唯一の希望はXHPマークアップパーサー自体でした。



そして、もちろん、レンダリングのために、4〜5個のタグではなく、本格的なレイアウトを使用しました。 包囲の設定は、ラスマスの例の設定に似ています。



HHVM + XHP

 siege -c 3 -b -t30s http://****.ru Transactions: 6003 hits Availability: 100.00 % Elapsed time: 29.54 secs Data transferred: 8.80 MB Response time: 0.01 secs Transaction rate: 203.22 trans/sec Throughput: 0.30 MB/sec Concurrency: 3.00 Successful transactions: 6003 Failed transactions: 0 Longest transaction: 0.03 Shortest transaction: 0.00
      
      







HHVM + PHP

 siege -c 3 -b -t30s http://****.ru Transactions: 19583 hits Availability: 100.00 % Elapsed time: 29.96 secs Data transferred: 33.22 MB Response time: 0.00 secs Transaction rate: 653.64 trans/sec Throughput: 1.11 MB/sec Concurrency: 2.99 Successful transactions: 19583 Failed transactions: 0 Longest transaction: 0.02 Shortest transaction: 0.00
      
      







約68%の劣化。 75%を超えていますが、それでも比較的多くあります。

なぜ相対的なのですか? テスト「アプリケーション」は、データベースにアクセスせず、ビジネスロジックなどを使用せずに、Viewのみで構成されていたためです。

実際には、ビューのレンダリング段階でのパフォーマンスの低下は、アプリケーションの他の部分と比較して無視できる程度であることが判明する場合があります。



最終的に、1つまたは別のテンプレートエンジンの選択は、システムアーキテクトに任されています。



参考情報:

  1. XHP: FacebookによるPHPの新しい作成方法
  2. Rasmus LerdorfによるXHPの概要
  3. githubのXHP



All Articles