4

PHP から html を出力するさまざまな方法に関する質問。これらのパフォーマンスの違いは何ですか:

方法 1 - 変数連結

$html = '';
$html .= '<ul>';
for ($k = 1; $k < = 1000; $k++){
    $html .= '<li> This is list item #'.$k.'</li>';
}
$html .= '</ul>';
echo $html;

方法 2 - 出力バッファリング

ob_start();
echo '<ul>';
for ($k = 1; $k < = 1000; $k++){
    echo '<li> This is list item #',$k,'</li>';
}
echo '</ul>';

変数を継続的に変更したり拡大したりすると、パフォーマンスが低下するのではないかと思います。あれは正しいですか?

乾杯!

GaryF に感謝しますが、アーキテクチャに関する回答は必要ありません。この質問はパフォーマンスに関するものです。どちらが速いかについては、いくつかの異なる意見/テストがあるようです。そのため、まだ受け入れられた答えはありません。

4

8 に答える 8

5

文字列の連結自体のアイデアはさておき、Web ページをどのように構築すべきかを本当に疑問に思っている (と私は思う)。

Model-View-Control パターンを使用してデータを構築し、それを単純なテンプレート ライブラリ ( Smartyなど) に渡してみてください。ビューを構築する方法について心配させてください。

より良い分離、より少ない懸念。

于 2008-10-06T22:41:55.707 に答える
2

私は通常、方法 1 を使用して、静的 HTML を含むテンプレート ファイルの任意の場所にその HTML を配置できるようにします。PHP からできるだけ多くの HMTL を除外しようとしています。テンプレートは通常別のファイルであるため、PHP はよりクリーンで短いものになります。

速度/パフォーマンスに関しては、違いは非常に小さいと思います。出力バッファリングでは、変数にアクセスできなくても、常に変数を拡大していますが、どこかに保存する必要があります。

すべてを中に入れてから一度にエコーするよりも、開閉<?phpが遅いのではないかとよく思い<?phpます。

最終的には、非常に複雑なスクリプトで数ミリ秒を話していると思います。

そうそう、方法 #1 は、echo $html;どこでもできるので、はるかに柔軟です。

于 2008-10-06T22:17:29.373 に答える
1

いくつかの考え:

結局はスタイルの問題だと思います。出力バッファリングで得られるものが気に入った場合は、おそらくそれが最適です。

于 2008-10-06T22:29:13.750 に答える
1

あなたの質問への回答もここにあります: php: output[] w/ join vs $output .=

文字列連結は、文字列を作成する最も速い方法です。

「エコー」と文字列の構築をテストしていませんが、バッファリングされた出力を使用していない限り、自己フラッシュバッファへの順次書き込みにより、エコーが最速になるはずです。(事前に文字列連結を行っても実際には回避できないフラッシュ内のスローダウンのみ)

于 2008-10-06T22:38:18.850 に答える
1

変数を常に変更して再出力すると、わずかなオーバーヘッドが生じるのは事実です。ただし、そうしないと、ある時点でスクリプトの実行が終了する可能性があり (中断などにより)、一連の echo ステートメントがページを何も印刷しないのではなく、部分的に印刷することになります。

于 2008-10-06T22:18:23.787 に答える
1

PHP の文字列が (C や C# のような不変の文字列とは対照的に) どのように変更可能であるかについて長い返信を入力するつもりでしたが、私が見つけた古い投稿にリンクするだけだと思います。私は基本的に、stringbuilder を使用する Java および C# ソリューションに関して、あなたが求めていることを扱います。

補足: stringbuilder ソリューションは次のようになります (未テスト):

$html = array();
$html[] = '<ul>';
for ($k = 1; $k < = 1000; $k++){
    $html[] = '<li> This is list item #';
    $html[] = $k;
    $html[] = '</li>';
}
$html[] = '</ul>';
echo implode('',$html);
于 2008-10-06T22:27:30.557 に答える
0

私が言及していないのは、通常、PHP 担当者は、HTML をクラス分けしたり、別の方法でスタイルを追加したりする必要がある設計担当者と協力しなければならないということです。

于 2008-10-07T01:31:31.450 に答える