複雑な出力制御にPHPを使用する場合、これは非常に実用的なメカニズムです。しかし、ネストされた出力バッファーが多すぎると、出力の例外やデバッグの困難につながる場合があります。この時点で、 OB_LIST_HANDLERS()関数は右ハンドラーになる可能性があります。
この記事では、 OB_LIST_HANDLERS()の役割と使用シナリオ、および冗長階層クリーニングのために他の出力バッファー関数を組み合わせて、出力ロジックが明確で安定していることを確認する方法を詳細に紹介します。
OB_LIST_HANDLERS()は、PHPが提供する関数であり、現在アクティブな出力バッファープロセッサのすべてのリストを返します。返品値は配列であり、各要素はバッファプロセッサの名前を表します( 「デフォルトの出力ハンドラー」 、 「MB_OUTPUT_HANDLER」 、 「OB_GZHANDLER」など)。
array ob_list_handlers(void)
パラメーターは受け入れず、現在有効になっているすべての出力バッファーのプロセッサ名を返します。
大規模なアプリケーションでは(特にWordPress、LaravelなどのCMSまたはフレームワークを使用する場合)、出力バッファーは、ネストされた複数の層でしばしばオンになります。ページが空白になったり、出力が一貫していない場合、問題を見つけるのは非常に面倒です。
OB_LIST_HANDLERS()を使用すると、現在利用可能な出力バッファーのレイヤー数と各レイヤーのプロセッサの内容をすばやく表示できるため、出力バッファーのデバッグまたはクリーニングが役立ちます。
ob_start('ob_gzhandler');
ob_start();
$handlers = ob_list_handlers();
echo "現在の出力バッファプロセッサにはあります:" . count($handlers) . " 層<br>";
foreach ($handlers as $index => $handler) {
echo "第 " . ($index + 1) . " 層处理器:$handler<br>";
}
出力:
現在の出力バッファプロセッサにはあります:2 層
第 1 層处理器:default output handler
第 2 層处理器:ob_gzhandler
注:配列内の順序は、最も内側のレイヤーから最も外側のレイヤーまでです。つまり、 OB_START()が呼び出すプロセッサがアレイで最初にランク付けされます。
while (ob_get_level() > 0) {
ob_end_clean(); // または使用します ob_end_flush() バッファーデータを送信します
}
出力バッファーを「リセット」する場合、このコードはレガシーバッファレイヤーがないことを保証します。
サードパーティのSDKを使用して、ページがコンテンツを出力しないことを確認するとします。次のデバッグコードを挿入できます。
echo "<pre>";
print_r(ob_list_handlers());
echo "</pre>";
次に、出力は次のとおりです。
Array
(
[0] => mb_output_handler
[1] => ob_gzhandler
[2] => default output handler
)
これは、出力バッファーが複数のレイヤーによってネストされていることを示しています。これは、プロセッサの特定の層が出力を傍受した可能性があります。現時点では、 OB_GZHANDLERがGZIPによって引き起こされる問題であるかどうかを確認できないなど、適切にクリーンアップするか、特定のプロセッサを無効にすることを選択できます。
出力の例外をデバッグするときは、 ob_list_handlers()を使用して、現在のバッファ構造をすばやく理解してください。
予期しない出力の遅延を避けるために、スクリプトが終了する前にバッファーが適切にフラッシュまたはクリーニングしていることを確認してください。
明確な理由なしに、あまりにも多くのOB_START()コールをネストしないでください。
header()を使用してURLジャンプを実行して「既に送信されたヘッダー」エラーを受信した場合、出力バッファーが処理されないためである可能性があります。
ob_start();
// その他の出力ロジック
header("Location: https://gitbox.net/user/login");
ob_end_flush();
exit;
このタイプの問題は、バッファが事前にコンテンツを出力しないようにすることで回避できます。
ob_list_handlers()は、多くの開発者が無視するガジェットですが、出力バッファリングの問題のトラブルシューティング時には非常に強力です。使用法を習得すると、複雑なプロジェクトの問題を迅速に見つけ、デバッグ効率を向上させることができます。
次回出力の問題に遭遇したら、最初にOB_LIST_HANDLERS()を見ることを忘れないでください。多くの「隠された」真実が見つかります。