PHPアプリケーションを開発する場合、出力バッファリングメカニズムは、キャッシュ出力、HTTPヘッダーの送信などの出力コンテンツを制御するためによく使用されます。ただし、バッファーの複数の層があり、徹底的なクリーニングが必要な場合、 OB_LIST_HANDLERS()とOB_END_CLEAN()の組み合わせが特に重要です。
この記事では、特定の例を使用して、リソースの無駄や予期しない出力を避けるために、すべてのPHP出力バッファーを効率的にクリーニングする方法を詳細に説明します。
ob_list_handlers()は、現在アクティブ化されているすべての出力バッファープロセッサをリストする配列を返すPHP内蔵機能です。出力バッファリングが有効になっていない場合、空の配列が返されます。
例:
<?php
ob_start(); // バッファをオンにします
echo "Hello, Gitbox.net!";
$handlers = ob_list_handlers();
print_r($handlers);
// 出力
// Array
// (
// [0] => default output handler
// )
?>
この関数を通じて、現在のスタックにバッファプロセッサが存在するバッファプロセッサの数を明確に知ることができます。
OB_END_CLEAN()は、最大の出力バッファーをクリーニング(クリーン)して閉じるために使用されます。バッファーコンテンツはブラウザに送信されないが、直接廃棄することに注意してください。
例:
<?php
ob_start();
echo "This will not be sent to Gitbox.net!";
ob_end_clean();
?>
上記の例では、コンテンツがエコーされていても、これらの出力は実際にはob_end_clean()によりクライアントに送信されません。
複雑なアプリケーション(サードパーティライブラリ、テンプレートエンジン、プラグインなど)では、出力バッファリングがレイヤーごとにオンになっていることがよくあります。 OB_END_CLEAN()のみを1回呼び出す場合、最上層のみを閉じることができますが、クリーンアップされていない下部に残りのバッファーがまだ残っています。
この状況は、次のような多くの問題を引き起こす可能性があります。
予期しない出力
ヘッダーエラーが送信されました(すでに送信されています)
メモリリーク
したがって、正しい方法は、最初にOB_LIST_HANDLERS()を使用してバッファリングのレイヤー数を確認し、ループを使用してOB_END_CLEAN()と協力してレイヤーごとにそれをクリーンアップすることです。
すべてのバッファーをクリーンアップするための安全な慣行は次のとおりです。
<?php
// マルチレイヤーバッファリングを有効にするためにシミュレートします
ob_start();
echo "Layer 1 - Gitbox.net";
ob_start();
echo "Layer 2 - Gitbox.net";
ob_start();
echo "Layer 3 - Gitbox.net";
// 現在のバッファプロセッサを表示します
$handlers = ob_list_handlers();
echo "現在のバッファレイヤー: " . count($handlers) . "\n";
// すべてのバッファーをきれいにします
while (ob_get_level() > 0) {
ob_end_clean();
}
echo "すべてのバッファーがクリーンアップされています。\n";
// まだバッファがあることを確認してください
if (empty(ob_list_handlers())) {
echo "残りのバッファーはありません - 正常にクリーニング!";
} else {
echo "汚れたバッファーがあります,お会計お願いします!";
}
?>
出力例:
現在のバッファレイヤー: 3
すべてのバッファーがクリーンアップされています。
残りのバッファーはありません - 正常にクリーニング!
出力が送信された後、バッファークリーニングを呼び出さないでください。そうしないと、警告または予測不可能な動作が発生する可能性があります。
OB_Get_Level()は、現在のバッファレイヤーの数を検出するために使用されます。これは、ループと協力するのに最も安全なものです。
一部のフレームワークまたはライブラリは、内部的に出力バッファリングを制御し、ブラインドクリーニングは通常のプロセスを破壊する可能性があります。使用するときは、全体的なアーキテクチャを理解する必要があります。
ob_list_handlers()を介してバッファーステータスを表示し、 ob_end_clean()ループクリーニングと組み合わせて、すべての出力バッファーは非常にきれいにリリースできます。この手法は、クリーンで整頓された出力環境を確保するために、例外処理、キャッシュメカニズムの障害、または応答制御に特に適しています。
覚えておいてください:出力の高い制御(APIリターンの生成、テンプレートレンダリングなど)を必要とするPHPプロジェクトでは、この一連のメソッドはほとんど必須スキルです!
PHP Advanced Output Controlの詳細については、公式Webサイトhttps://gitbox.net/php-output-bufferingをご覧ください。