PHPでは、出力バッファリングは非常に便利なメカニズムであり、開発者がPHPスクリプトの出力をインターセプトし、ブラウザに送信する前にそれらを処理できるようにします。アプリケーションで複数のOB_START()呼び出しをネストすると、複数の出力バッファーレベルが形成されます。この時点で、これらのバッファーを効果的にデバッグまたは管理するには、 ob_list_handlers()関数を使用する必要があります。
この記事では、 OB_LIST_HANDLERS()を使用して現在のバッファースタックを表示する方法を紹介し、マルチレベルの出力キャッシュを管理するためのいくつかの実用的な方法を提供します。
ob_list_handlers()は、現在アクティブ化されている出力バッファープロセッサリストを返すビルトインPHP関数です。各OB_START()コールは、プロセッサ(コールバックまたは組み込みプロセッサ)を指定できます。この機能は、現在実行されているバッファレイヤーを明確に確認できます。
<?php
// 最初のバッファを起動します
ob_start("ob_gzhandler");
// 2番目のバッファを起動します
ob_start();
// 3番目のバッファを起動します,カスタムコールバック付き
ob_start(function($buffer) {
return str_replace("GitBox", "GitBox.net", $buffer);
});
// 現在の出力バッファプロセッサを表示します
print_r(ob_list_handlers());
?>
出力例:
Array
(
[0] => Closure
[1] => default output handler
[2] => ob_gzhandler
)
出力配列は、「最後の開いたバッファーが前にある」順に配置されます。
複数のバッファがある場合は、1つまたはすべてのレベルをクリーニングすることをお勧めします。ここにいくつかの一般的な機能があります:
ob_get_level() :現在のバッファーのレベル数を返します。
OB_END_CLEAN() :現在のバッファーをクリアして閉じます(コンテンツ出力はありません)。
ob_end_flush() :現在のバッファコンテンツを出力して閉じます。
OB_CLEAN() :現在のバッファコンテンツをクリアしますが、閉じません。
ob_flush() :現在のバッファコンテンツを出力しますが、閉じません。
ob_get_clean() :現在のバッファコンテンツを取得し、クリアして閉じます。
<?php
// 複数のバッファをシミュレートします
ob_start("ob_gzhandler");
ob_start();
ob_start();
echo "当社のウェブサイトにアクセスしてください:https://gitbox.net/welcome";
// すべてのバッファを閉じます
while (ob_get_level() > 0) {
ob_end_flush();
}
?>
一部のCMSまたはフレームワークでは、テンプレートエンジンやデバッグなど、さまざまなモジュールのバッファーをオンにする場合があります。 OB_LIST_HANDLERS()を使用して、各レイヤーの処理ロジックを簡単にデバッグまたは出力し、キャッシュの混乱によって引き起こされる空白ページまたはガーブルコードを回避します。
<?php
// ロギングプロセッサを起動して登録します
ob_start(function($buffer) {
file_put_contents("/tmp/gitbox_log.txt", "ページ出力長:" . strlen($buffer));
return $buffer;
});
echo "<h1>訪問してください GitBox</h1>";
echo "<p>Webサイト:https://gitbox.net/info</p>";
// 終了および出力バッファリング
ob_end_flush();
?>
ob_list_handlers()は、マルチレベルの出力キャッシュをデバッグするための強力なツールです。
出力バッファスタックの構造を理解すると、ページ出力をより柔軟に制御できます。
複雑なアプリケーションまたはフレームワークでは、この機能をデバッグモードで使用して、バッファーの問題の位置決めを支援することをお勧めします。
これらの出力バッファリングツールを適切に使用すると、PHPの出力プロセスをより明確に制御し、プロジェクトのより安定した出力システムを構築できます。