1

インターネット上で、関数の使用を提案している記事はほとんど見つかりませんob_でした。これらの利点はすべて強調されており、言及されている関数を使用することの欠点はありません。

ob_私の質問は、関数を使用すること、または設定することの欠点は何ini_set('output_buffering', '1');ですか?

4

4 に答える 4

1

出力バッファリングを使用することの短所は、使用状況に完全に依存します。

出力バッファリングの最大の短所の 1 つは、ランタイム エラー メッセージまたは警告が抑制される可能性があり、場合によっては誤ったデータになる可能性があることです。

次の例を検討してください。

<?php
function render_template() {
    ob_start();
    // Do some processing
    fetch_template_and_render();
    do_render();
    // end capture
    $output = ob_get_clean();
    return $output;
}

memchace::set( $some_key, render_template() );
?>

または実行時エラーfetch_template_and_renderdo_renderスローすると、それらは出力にダンプされ、最終的にこの例ではデータベースまたはキャッシュに格納されます。

ここに、私が何を意味するかを示す 2 つのスニペットを示します。これらを自分で試すことができます

#1

<?php 
    echo 1/0; 
?>

出力

Warning: Division by zero on line 1

#2

<?php 
    ob_start();
    echo 1/0; 
    $var = ob_get_clean();
?>

何も出力しません。

このような事態を避けるために、エラーチェックを入念に行い、予防策を講じる必要があります。

勤勉に使用すると、ob_* 関数は非常に強力で非常に便利です。

于 2013-06-19T14:14:05.243 に答える
0

適切に実装すれば、出力バッファリングの使用に大きな欠点はありません。

出力バッファリングにより、エラー/警告/通知 (停止エラーを除く) が出力に表示されることがありますが、すぐにはわかりません。これは通常、適切なエラー チェック、php 環境のより適切な構成、および適切なエラー ハンドラー ( ErrorExceptionstry/catch でキャッチできるエラーを変換するものなど) の実装によって解決されます。エラー ハンドラーの例として、Whoops!を参照してください。を使用ErrorExceptions)。

メモリが欠点になる可能性がありますが、通常、ほとんどのスクリプトでは出力サイズは重要ではありません。fpassthruこれに対する例外は、ファイル コンテンツの配信など、大量のデータを送信する場合です。これは、このコンテンツを出力に書き込む前に、出力バッファリング (ob_end_clean または ob_end_flush) をオフにすることで解決できます。

于 2013-06-19T14:29:41.547 に答える
-1

ob_ 関数のかなり良い使い方は次のとおりです。

ob_start("ob_gzhandler");

zlib 拡張機能が PHP で有効になっている場合、出力が gz 圧縮されていることが保証されます。大きなページのページ転送が著しく高速化されます。

于 2013-06-19T14:24:09.657 に答える