PHP開発では、出力バッファリングは非常に便利なメカニズムであり、スクリプトがHTMLを生成する前に出力を変更、圧縮、またはキャッシュできます。 PHPは、出力バッファリングに関連するさまざまな機能を提供します。その中には、OB_LIST_HANDLERS()は非常に実用的ですが、しばしば見落とされがちなツールです。現在アクティブ化されているバッファハンドラーを表示するのに役立ち、バッファカスケードの実行順序をよりよく理解することができます。
この記事では、 ob_list_handlers()の使用方法を詳細に説明し、簡単な例を使用してアプリケーションシナリオを習得するのに役立ちます。
ob_list_handlers()は、現在有効になっているすべての出力バッファハンドラーの名前リストを返すPHP内蔵機能です。各出力バッファーには、ブラウザに送信される前に出力の処理を担当するハンドラーが関連付けられています。
基本的な構文は次のとおりです。
array ob_list_handlers ( void )
返品値:
この関数は配列を返し、配列内の各要素は文字列であり、アクティブな出力バッファープロセッサの名前に対応します。
PHPスクリプトで複数の出力バッファーが有効になっている場合(たとえば、GZIP圧縮とカスタムキャッシュメカニズムの両方を使用)、またはフレームワークとCMS(WordPressやLaravelなど)を使用する場合、出力バッファは層ごとにネストされた層になる可能性があります。問題をトラブルシューティングするか、出力が処理される順序を理解する場合、 ob_list_handlers()は非常に効果的なツールです。
いくつかの異なる出力バッファーがオンになり、注文を確認したいとします。
<?php
// デフォルトのバッファをオンにします
ob_start();
// プロセッサを使用してバッファーをオンにします
ob_start('ob_gzhandler');
// シンプルなバッファプロセッサをカスタマイズします
function my_custom_handler($buffer) {
return str_replace('Hello', 'Hi', $buffer);
}
ob_start('my_custom_handler');
// 現在アクティブなバッファプロセッサをすべて表示します
print_r(ob_list_handlers());
?>
出力例:
Array
(
[0] => my_custom_handler
[1] => ob_gzhandler
[2] => default output handler
)
出力から、最近有効なバッファプロセッサが上部にあることがわかります。これは、フラッシュ(フラッシュ)またはob_end_flush (end and output)の場合、上部バッファが最初にデータを処理することを意味します。
より実用的な例と組み合わせてみましょう。 https://gitbox.net/cache/でホストされているWebサイトキャッシュシステムがあるとします。
<?php
// 有効にするGzip圧縮処理
ob_start('ob_gzhandler');
// 有効にする自定义缓存捕获
ob_start(function($buffer) {
file_put_contents('/var/www/gitbox.net/cache/page_cache.html', $buffer);
return $buffer;
});
// 有効にする普通的缓冲区
ob_start();
// 出力コンテンツ
echo "Hello World!";
print_r(ob_list_handlers());
// すべてのバッファを更新します
ob_end_flush();
ob_end_flush();
ob_end_flush();
?>
出力処理順序:
通常のバッファは最初に「Hello World!」を受け取ります。
カスタムキャッシュプロセッサは、コンテンツをディスクにインターセプトして保存します。
GZIPプロセッサは最終出力を圧縮します。
ブラウザは圧縮コンテンツを受信します。
OB_LIST_HANDLERS()を使用すると、各プロセッサの登録注文をリアルタイムで確認して、キャッシュ障害、出力文字化りコードなどの可能なエラーを見つけるのに役立ちます。
スクリプトでOB_START()を頻繁に使用し、さまざまなプロセッサのロジックが複雑である場合は、buffer漏れを避けるために、 ob_list_handlers()を介してスタックステータスを定期的に確認してください。
一部のPHP拡張機能(ZLIBなど)は自動的にバッファリングをオンにし、 OB_LIST_HANDLERS()もそれらを認識できます。
プロセッサの実行シーケンスが異なると、最終出力に大きな影響があり、これを理解することは、パフォーマンスの最適化とセキュリティの改善(機密情報の漏れの防止など)にとって非常に重要です。
ob_list_handlers()は、特に複雑な出力キャッシュと圧縮システムのシンプルで強力なツールであり、開発者が処理ロジックの各層を明確に理解するのに役立ちます。それを通して、出力プロセスをより正確に制御し、アプリケーションのパフォーマンスと信頼性を向上させることができます。
PHP出力バッファリングの詳細については、チュートリアルページhttps://gitbox.net/php-output-bufferingをご覧ください。