評価または含める?

現在のプロジェクトの1つを自分のフレームワークで開発し、並行して実行して追加しています。 なぜ私は車輪を再発明する必要があり、既存の車輪とどう違うのか、それを一般に紹介するときに書きます。 今、私はパフォーマンスについてのいくつかの考えを共有し、同時に同僚の意見を聞きたいです。 おそらく私の観察は、フレームワークを使用しない人にとって有用でしょう。



コメントツリーを実装する必要があったとき、ビュー(MVCのビュー)を再帰的に呼び出す必要に直面しました。 私はビューを持っているので、ほぼどこにでも、これらはHTMLコードの一部とPHPを埋め込む機能を持つ通常のファイルであるため、includeを使用して接続されます。 このインクルードが何百回も再帰的に呼び出されることを想像すると、不安になりました。 最初の考えは、最初のリクエストのビューファイルをメモリに入れてから、evalで実行することです。 このアプローチにより、ビューコードをキャッシュし、データベースに保存することもできます。 evalはPHPのみを使用し、ビューは純粋なPHPコードではないため、「?>」および「<?Php」でコンテンツをフレーム化します。



だから、ポイントに。



テスト

はじめに、さまざまな方法で、ループで、次のような単純なビュー「view.php」を表示しi=<?=$i?>



たとえば、 i=<?=$i?>







コード 時間 s

(括弧内-eAcceleratorを使用)
  for($ i = 0; $ i <100; $ i ++)include( 'view.php'); 
0.0058141 (0.002068)
  for($ i = 0; $ i <100; $ i ++){$ code = '?>'。file_get_contents( 'view.php')。 '<?php';  eval($コード);  } 
0.005527 (0.0056472)
  $ code = '?>'。file_get_contents( 'view.php')。 '<?php';  for($ i = 0; $ i <100; $ i ++){eval($コード);  } 
0.0015929 (0.0016122)




そして再帰的に



コード 時間 s

(括弧内-eAcceleratorを使用)
  $ i = 0;  include( 'view.php');  ---------- view.php ---------- html <?php if(++ $ i <100){include( 'view.php');  }?> 
0.006865 (0.0019491)
  $ i = 0;  $ code = '?>'。file_get_contents( 'view.php')。 '<?php';  eval($コード);  ---------- view.php ---------- html <?php if(++ $ i <100){$ code = '?>'。file_get_contents( 'view。 php ')。' <?php ';  eval($コード);  }?> 
0.008599 (0.0087898)
  $ i = 0;  $ code = '?>'。file_get_contents( 'view.php')。 '<?php';  eval($コード);  ---------- view.php ---------- html <?php if(++ $ i <100){eval($ code);  }?> 
0.0034332 (0.0032461)




結論

最初に目を引くのは、evalを使用したオプションは、eAcceleratorを使用した最適化とキャッシングに適していません。 したがって、それを使用し、evalの他の利点を必要としない場合は、インクルードに焦点を当てることをお勧めします。



ビューが複数回呼び出される場合、evalを使用することは理にかなっていますが、アクセラレータを使用する方法はありません。 または、ビューがデータベースに保存されている場合。



evalのエラー処理もわずかに異なります。 たとえば、コードの解析中にエラーが発生した場合、スクリプトの実行は中断されません。 これは、場合によっては便利です。 しかし、同時に、エラーメッセージは異なって見えるため、少し混乱する可能性があります。



Parse error: syntax error, unexpected T_ECHO, expecting ')' in /www/test/eval_vs_include/test.php(39) : eval()'d code on line 4







ここで、ファイルtest.phpの行39にあるevalにフィードされたファイルview.phpの行4で、示されたエラーが発生しました。 もちろん、evalがfalseを返した場合、インクルードファイルの名前を表示することを妨げるものは何もありません。 エラーの作業は通常のモードではなく、作業中のドラフトにはエラーが表示されないことを考慮すると、この欠点は重要ではないと考えます。



評価

+アクセラレータが使用されていない場合、インクルードよりも高速

+フレームワークまたはテンプレートエンジンで表現コードをキャッシュする機能

+ビューをデータベースに保存する機能

+エラーが発生してもスクリプトの実行は中断されません

-外部アクセラレーターによって最適化またはキャッシュされません

-エラー出力は通常とは異なります

-一部のホスティングではevalが許可されない場合があります



含める

+どこでも動作

+外部アクセラレーターにより生産性が大幅に向上

-アクセルなしの低速

-エンジンのファイルに含まれるコードをキャッシュする方法はありません

-プラグインコードはファイルにのみ含めることができます



CodeIgniterフレームワークでは、ビューの出力にもevalが使用されますが、設定で短い「<?=」を「<?Php esho」に置き換える必要があることが示され、同時にPHP設定で短いタグが無効になることに注意してください。 その他の場合はすべて、includeが使用されます。 CakePHPは常にincludeを使用します。



All Articles