0

そのため、ここでは自社開発のテンプレート システムを使用しています。これは軽量で、これまでのところうまく機能しています。

私たちが直面している壁は、テンプレートをループできるようにしたいということです。ユースケースは、検索結果のようなものです。私たちはこれを行う方法を考えようとしています。現在3つの方法を考えています。まず、ループ内にhtmlを保存し、それをループしてconcatを使用して変数をhtmlに入れるという古き良き方法です。私たちが思いついた 2 番目の方法は、ファイルを繰り返しインクルードすることでした。そして 3 番目の方法は、ファイルを一度インクルードし、出力バッファリングを使用してその出力をキャプチャし、それにテキスト echo " を追加してから、eval を使用することでした (私の上司は、それを行うための創造的な方法を考え出すことを望んでいました)。

そうですね、html をロジックから完全に分離できるので、繰り返しインクルードする方法を好みます。eval メソッドもこれを行いますが、もう少しハックなようです。これについていくつかの時間テストを行ったところ、html をループ内に配置する方法 (方法 1) が最も速く、その後に eval メソッドが続き、複数回を含むことが最後であることがわかりました。インクルードは、実際には eval メソッドよりも約 5 ~ 6 倍遅くなりました。(ファイルを含めたり、ファイルを 1000 回評価したり、それを 100 回実行したりして、それらを平均して結果を取得しました)。

複数のインクルードを高速化する方法はありますか? (include php を実行するたびに、ファイル システムに再度アクセスしているように見えます。)

または、この種のことを達成する方法を誰かが持っていますか?

4

3 に答える 3

2

テストが示したように、スクリプトを最適化する最善の方法は、既に含まれている HTML コードをスクリプトに循環させることです。

影響時間は次のとおりです。

  • eval() は PHP パーサーを呼び出してコードを検証します。
  • include() はディスクアクセスを使用します

各 include() は、変更されていないファイルのディスクを読み取るパフォーマンスを低下させます。このディスク アクセスを最適化するには、eval() オプションを使用します。

  • include(): 初期パーサー + [ディスクアクセス + パーサー]*N ループ;
  • eval(): 初期パーサー + ディスクアクセス + パーサー*N ループ
  • インライン HTML: 初期パーサー

コードをきれいに保つために、HTML を含む関数を作成したり、グローバル変数を使用したり、HTML に表示するために必要なすべてのデータを含む単一のオブジェクトまたは配列変数を使用したりできます。

function html_comment ($comment)
{
    //global $comment;

    ?>
    <div class="comment">
        <div class="author"><?php echo $comment['author'] ?></div>
        <div class="date"><?php echo $comment['date'] ?></div>
        <div class="date"><?php echo $comment['content'] ?></div>
    </div>
    <?php
}

...
foreach ($comments as $comment)
    html_comment($comment);
于 2009-11-10T20:05:01.327 に答える
0

古い質問、私は知っています。

とにかく、テンプレート内に単純な for または foreach ループを作成することをお勧めします。それは何も悪いことではありません。まず、いくつかのプレゼンテーションコードをループすることは、私の目にはまだプレゼンテーションロジックであるためです(これにより、出力を列の出力から行の出力に変更することも簡単になります-愚かな例)。次に、PHP は依然としてテンプレート言語です。テンプレートでいくつかの単純な制御構造を使用しても問題はありません。Smartys のようなシステムを使用することは、抽象化のレイヤーをもう 1 つ (学習する別の構文を使用して) 追加するだけであり、PHP の多くの機能を備えています (したがって、かなりのオーバーヘッドが発生します)。それは私の目にはナンセンスです (補足: 私にとってそれはプラットフォーム内効果、アンチパターンです)。

于 2009-11-08T23:23:13.030 に答える
0

最終ページをキャッシュします。私が言いたいのは、すべての「ブロック」(ループ、断片、呼び方は何でも) を取得して、それらをキャッシュ内の 1 つの PHP ファイルに結合し、それ以降はそれを含めることです。そうすれば、たとえば 25 回ではなく、リクエストごとに 1 回だけファイルシステムにアクセスできます。

于 2009-06-03T22:07:44.487 に答える