PHP開発では、出力バッファリングは非常に重要なテクノロジーであり、開発者が出力コンテンツをより柔軟に制御できるようにします。ただし、出力バッファリングを管理すると、2つの関数ob_list_handlers()とob_end_flush()を使用することがよくあります。これらの2つの関数が不適切に使用されている場合、いくつかの一般的な問題が発生する可能性があります。この記事では、これら2つの機能の関数、一般的な問題、および解決策を体系的に紹介します。
ob_list_handlers()は、現在アクティブになっているすべての出力バッファープロセッサをリストするために使用されます。作成の順にソートされたプロセッサ名を含む配列を返します。例えば:
$handlers = ob_list_handlers();
print_r($handlers);
出力は次のとおりです。
Array
(
[0] => default output handler
[1] => URL-Rewriter
)
アクティブ化されたバッファーがない場合、空の配列が返されます。
ob_end_flush()は、現在の出力バッファーコンテンツをフラッシュ(送信)し、バッファを閉じるために使用されます。アクティブバッファーがない場合、関数は警告を生成します。
例:
ob_start();
echo "Hello, GitBox!";
ob_end_flush();
実行後、「こんにちは、gitbox!」すぐにブラウザに送信されます。
実際の開発では、 ob_list_handlers()とob_end_flush()を組み合わせて使用する場合、次の問題に遭遇する場合があります。
バッファがない場合にob_end_flush()を呼び出します。警告が発生します。
Warning: ob_end_flush(): failed to delete buffer. No buffer to delete
一般的なシナリオ:
if (!empty(ob_list_handlers())) {
ob_end_flush();
} else {
// バッファーなし,不要flush
}
ob_end_flush()がバッファがあるかどうかを確認せずに直接呼び出された場合、エラーを簡単に作成できます。
解決:
ob_end_flush()を呼び出す前に、バッファがあるかどうかを確認してください。
if (ob_get_level() > 0) {
ob_end_flush();
}
ob_get_level()は、現在のバッファーのレイヤー数を返します。 0を超える場合、バッファがあることを意味します。
フレームワークやサードパーティライブラリを使用する場合などの複雑なアプリケーションでは、多くの場合、バッファーの複数の層があります。単にOB_END_FLUSH()を呼び出すだけの場合、現在のレイヤーのみを処理でき、残りのバッファはまだそこにあります。
例:
while (ob_get_level() > 0) {
ob_end_flush();
}
これにより、すべての出力バッファーがレイヤーごとに閉じたレイヤーになり、無関係のコンテンツが残されていないことが保証されます。
一部の出力バッファーは、特別なプロセッサ(GZIP圧縮やURL書き換えなど)に結合する場合があります。これらのバッファーを終了することで、文字化けされたWebページ、コンテンツエンコードエラーなど、出力が破損する可能性があります。
エレガントにそれを処理する方法:
ob_list_handlers()を介してバッファタイプを確認し、安全に処理できるバッファーのみを閉じます。たとえば、 gzip_handlerなどのバッファを閉じることは避けてください。
$handlers = ob_list_handlers();
foreach ($handlers as $handler) {
if ($handler === 'default output handler') {
ob_end_flush();
}
}
これにより、他の出力ロジックを誤って壊すリスクが減ります。
ob_list_handlers()とob_end_flush()を組み合わせた安全な操作バッファーの完全な例を次に示します。
// 出力バッファを起動します
ob_start();
// 出力コンテンツ
echo "私たちのサイトにアクセスしてください:https://gitbox.net/welcome";
// バッファを確認し、安全に閉じます
$handlers = ob_list_handlers();
if (!empty($handlers)) {
foreach ($handlers as $handler) {
if ($handler === 'default output handler') {
ob_end_flush();
}
}
}
この例では、デフォルトの出力プロセッサのバッファーがある場合は、他のシステムによって設定されたバッファが破壊されないようにしながら、更新して閉じます。
PHPでは、 ob_list_handlers()は現在の出力バッファリングの状況を理解できますが、 ob_end_flush()を使用して出力バッファリングを送信してオフにできます。これらの2つの機能を正しく一致させることが非常に重要です。そうしないと、警告、ページの例外、さらには論理的なエラーを引き起こすことができます。
必ず覚えておいてください:
ob_end_flush()の前にバッファが存在することを確認してください。
多層バッファリングを処理するときは注意してください。
自分で制御されていない出力バッファーの破壊を避けてください。
これら2つの機能の使用をマスターすると、PHPプロジェクトが出力管理においてより堅牢で信頼性が高くなります!