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