インターネット上で、関数の使用を提案している記事はほとんど見つかりませんob_
でした。これらの利点はすべて強調されており、言及されている関数を使用することの欠点はありません。
ob_
私の質問は、関数を使用すること、または設定することの欠点は何ini_set('output_buffering', '1');
ですか?
インターネット上で、関数の使用を提案している記事はほとんど見つかりませんob_
でした。これらの利点はすべて強調されており、言及されている関数を使用することの欠点はありません。
ob_
私の質問は、関数を使用すること、または設定することの欠点は何ini_set('output_buffering', '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_render
をdo_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_* 関数は非常に強力で非常に便利です。
適切に実装すれば、出力バッファリングの使用に大きな欠点はありません。
出力バッファリングにより、エラー/警告/通知 (停止エラーを除く) が出力に表示されることがありますが、すぐにはわかりません。これは通常、適切なエラー チェック、php 環境のより適切な構成、および適切なエラー ハンドラー ( ErrorExceptions
try/catch でキャッチできるエラーを変換するものなど) の実装によって解決されます。エラー ハンドラーの例として、Whoops!を参照してください。を使用ErrorExceptions
)。
メモリが欠点になる可能性がありますが、通常、ほとんどのスクリプトでは出力サイズは重要ではありません。fpassthru
これに対する例外は、ファイル コンテンツの配信など、大量のデータを送信する場合です。これは、このコンテンツを出力に書き込む前に、出力バッファリング (ob_end_clean または ob_end_flush) をオフにすることで解決できます。
ob_ 関数のかなり良い使い方は次のとおりです。
ob_start("ob_gzhandler");
zlib 拡張機能が PHP で有効になっている場合、出力が gz 圧縮されていることが保証されます。大きなページのページ転送が著しく高速化されます。