2009-06-03 12 views
0

ここでは、私たちは自宅で成長したテンプレートシステムを持っています。これは軽量で、今まで私たちにとって素晴らしい作品です。PHPのテンプレートループの結果

私たちが打っている壁は、テンプレートをループすることができるということです。ユースケースは検索結果のようなものです。私たちはこれを行う方法を考えようとしています。今私たちは3つの方法を考え出しています。まず、良い古いは、ループ内のhtmlを格納し、それをループし、htmlに変数を配置するためにconcatを使用しています。私たちが考えた第2の方法は、ファイルを繰り返し含めることでした。そして第3の方法は、ファイルを一度インクルードし、出力をキャプチャして出力をキャプチャし、テキストをエコーし​​てからevalを使用することでした(私の上司は、創造的なやり方を考え出しました)。

私は、ロジックから完全にhtmlを分離できるので、繰り返しのインクルード方法が好きです。evalメソッドもこれを行いますが、もう少し面白そうです。ループの中にhtmlの権利があることが最も速く、evalメソッドが続き、最後に複数回含まれていることがわかりました。実際には、evalメソッドよりも5〜6倍遅かったです(Weファイルをインクルードし、ファイルを1000回評価し、100回実行して結果を得るため平均した)

複数のインクルードを高速化する方法はありますか? (インクルードするphpが再びファイルシステムに当たっているたびに表示されるでしょう)

誰かこのタイプのことを達成する方法はありますか?

+0

これは、sprintf(%s、 %dなど)、file_get_contents()を実行してフォーマットされたhtmlのチャンクを取得してから、変数。 – artlung

+0

PHPリファレンス:http://php.net/sprintf – artlung

+0

@artlung:Ew、sprintfは醜いです!なぜあなたはそれをしたいのですか? –

答えて

0

最後のページをキャッシュします。私が意味することは、すべての "ブロック"(ループ、ピース、あなたがそれらを呼びたいと思っているもの)をとり、それらをあなたのキャッシュ内の1つのPHPファイルに結合し、それからそれだけを含めることです。そうすれば、例えば25回ではなく、要求ごとに1回だけファイルシステムにヒットすることになります。

0

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

とにかく、私はテンプレート内にforループまたはforeachループを使用することをお勧めします。それには何も問題はありません。まず、いくつかのプレゼンテーションコードをループすることは、私の目のプレゼンテーションロジックです(これは、出力を列の出力から行の出力に変えることも簡単です)。第二に、PHPはまだテンプレート言語です。テンプレートに単純なコントロール構造を使用することには何も問題ありません。 Smartysのようなシステムを使うのは、PHPの能力の大部分を持っている抽象概念の層を追加するだけです(それで、かなりのオーバーヘッドが発生します)。それは私の目にはナンセンスです(脇に:私のためには、inner-platform effect、アンチパターン)。

+0

それは悪い考えではありません。私たちが実際にやったことは、組み込みのPHPのDOMパーサーを使ってファイルにロードし、それを使ってそれぞれの使用のためにテンプレートを変更することです。 大きな問題は、PHPを最小限に抑えた非常にクリーンなテンプレートを用意したいと思っています(それを取り除くことができればコントロール構造はありません)。また、発生する投稿ごとに変更できるように、 。 – Boushley

2

テストで示されているように、スクリプトを最適化するには、既に含まれているHTMLコードをスクリプトに戻すことをお勧めします。

インパクト時から来ている:

  • のeval()は、コード
  • を検証するためにPHPパーサを呼び出します(含める))

それぞれが(含めるディスクアクセスを使用して、パフォーマンスの読み取りをダウングレード変更されていないファイルのディスクこのディスクアクセスを最適化するには、eval()オプションを使用します。

  • include():intial-parser + [disk-access + parser] * Nループ。
  • のeval():グローバルを使用し、あなたがHTMLを含む関数を作成することができ、クリーンなコードを維持するために初期のパーサー

:初期パーサ+ディスク・アクセス+パーサ* Nは

  • インラインHTMLをループ変数、またはあなたのHTMLに表示する必要があるすべてのデータを含む単一のObjectまたはArray変数など

  • +0

    私たちの知見はかなりよくまとまっています...機能を持つことは良い考えです。私は本当に賢明なものがあると思っていましたが、私は思っていませんでした。 – Boushley

    +0

    次のステップは、phpBBに見られるように、共通のセクションをコンパイルしてキャッシュに保存し、変更後または変更後に更新することです。私はあなたがあなたのタイミングでかなり良い仕事をしたと思う –