PHP拡張dom_varimport:ネストされた配列のDOMDocumentへの迅速な変換

一部のプロジェクトでは、メインテンプレートエンジンとしてXSLTを使用しています。 XSLTのよく知られている欠点(たとえば、冗長性、相対的な遅さなど)に加えて、「標準」言語、「副作用」やパターンマッチングがないというイデオロギー、必要に応じてテンプレートからヘルパークラスメソッドを呼び出す機能もあります。 (exslt拡張経由)。 少し前に、 ShortXSLTライブラリをレイアウトしました。これにより、かさばる<xsl:value-of select = "/ root / abc" />および<xsl:choose> ... </ xsl:choose>の代わりに{/ root / abc}および{if ...} ... {elseif} ... {/ if}パフォーマンスを損なうことなく、冗長性の問題は部分的に解決されます。



しかし、今はXSLTの長所と短所については話していません(この技術の反対者と支持者が豊富に見つかると確信しています)。 XSLTテンプレートを使用して既存のプロジェクトで使用するのに便利な1つの手法を説明し、この手法を優れたパフォーマンスで実装するライブラリへのリンクを提供したいと思います。



XMLテキスト表現の生成をバイパスして、データをXSLTに渡す


ページに表示するオブジェクトのネストされたPHPリストを生成するコントローラーがあるとします。 この配列をXMLに変換し、XSLTテンプレートの入力に移動する必要があります。 このPHP構造からXMLへの変換が各コントローラーで手動で実行されなかった場合は便利ですが、テキストのXML表現をバイパスして、XSLTテンプレートを直接PHPデータに適用できる抽象化の中間層がありました。 したがって、エラーの可能性を減らし、手紙を減らします。 データのXML表現をバイパスして、XSLTテンプレートを直接操作できます。



少し前に、CでPHP拡張dom_varimportGitHubに投稿されています )を書きました。 これには同じ名前の関数が含まれ、その入力にはDOMDocumentオブジェクトとネストのPHP配列が提供されます。 この関数は、渡されたDOMDocumentを入力配列のXML表現で満たし、非常に高速に処理します。純粋なPHPで記述されたコードよりも約20倍高速です。 数千のプロパティとオブジェクトが添付されたサイズが約1 MBの大きなドキュメントは、約1〜2ミリ秒で形成されます。



たとえば、呼び出し:



 $ doc = new DOMDocument();
 dom_varimport(
     $ doc
    配列(
         "some_key" => 111、
         123、
         0.5、
         "arr" =>配列( "1a" => "1a")、
         "obj" =>(オブジェクト)配列( "prop" => "val")、
        本当
        偽
         「b」=> null、
         「空」=>配列()、
     )、
     「root」//オプション、デフォルトは「root」
 );
 $ doc-> formatOutput = true;
 echo $ doc-> saveXML();  //これはデバッグ専用です。実際には、saveXML()を呼び出す必要はありません。


このXMLドキュメントを印刷します。



 <?xml version = "1.0"?>
 <ルート>
     <some_key key = "some_key"> 111 </ some_key> <!-プレーンキー=値->
     <item key = "0"> 123 </ item> <!-数値キーは「item」タグです->
     <item key = "1"> 0.5 </ item> <!-double->
     <arr key = "arr"> <!-ネストされた配列->
         <item key = "1a"> 1a </ item> <!-無効なタグ名は「item」に変換されます->
     </ arr>
     <obj key = "obj"> <!-ネストされたオブジェクト->
         <prop key = "prop"> val </ prop>
     </ obj>
     <item key = "2"> 1 </ item> <!-trueは1に変換->
     <item key = "3" /> <!-falseは空の文字列に変換します->
     <b key = "b" /> <!-nullも空の文字列に変換->
     <empty key = "empty" /> <!-空の配列は空の要素です->
 </ root>


配列キーとオブジェクトプロパティは、おそらく同じ名前のXML要素になります(ただし、名前がXML要素に対して有効でない場合は、代わりに「item」が使用されます)。 このようなXMLドキュメントは、デバッグ時に非常に読みやすく、非常にコンパクトです。 そのため、出力でDOMDocumentオブジェクトを取得します。これは既にXSLTProcessorに渡すことができます。 XMLテキスト表現はどこにも現れず、どこでも解析されません。



拡張機能のインストール方法


拡張機能はCで記述されているため、GCCおよびphp5-src(またはphp5-devel)などのパッケージがインストールされているマシンでコンパイルする必要があります。 これはまったく怖いものではありません。



 git clone https://github.com/DmitryKoterov/dom_varimport.git
 cd dom_varimport
 phpize
 ./configure
作る
テストする
 make install#またはモジュール/ dom_varimport.soを手動でコピーします
 phpize --clean


「make install」ステップは省略できます。バイナリファイルモジュール/ dom_varimport.soを取得し、他のマシンを含め、PHP拡張機能(/ usr / lib / php5など)を含むディレクトリにコピーするだけです。 最後に、/ etc / php5 / conf.d / dom_varimport.iniの拡張機能を接続し、php5-fpmまたはapacheを再起動する必要があります。



拡張子= /usr/lib/php5/dom_varimport.so



All Articles