出力バッファリングコントロールにPHPを使用する場合、開発者はob_start()を介して1つ以上のキャッシュハンドラーを登録することがよくあります。ただし、複数のモジュールがプロジェクトで同じバッファ処理機能を繰り返し登録すると、出力が複数回処理され、パフォーマンスに影響を与え、さらには論理エラーが発生する可能性があります。
この冗長登録を回避するために、 OB_LIST_HANDLERS()関数を使用して、現在登録されているすべての出力バッファリングプログラムを表示し、実際の条件に基づいて判断とコントロールを作成できます。
OB_LIST_HANDLERS()は、PHPが提供する組み込み関数で、現在アクティブな出力バッファハンドラーの名前を含む配列を返します。 ob_start()を呼び出してコールバック関数を渡すたびに、バッファー処理スタックに関数名が追加されます。
array(
[0] => default output handler,
[1] => gzhandler
)
アプリケーションの複数のコンポーネントが次のステートメントを呼び出すと想像してください。
ob_start('gzhandler');
その結果、出力コンテンツはGZHandlerによって複数回圧縮され、ブラウザが正しく解析できない場合、またはコンテンツが異常になります。
これを防ぐために、 ob_list_handlers()を使用して、新しい出力バッファリング機能を登録する前に既に存在するかどうかを確認できます。
Gzhandlerの重複登録を回避する方法を示す実際のコード例は次のとおりです。
<?php
// ハンドラーが登録されているかどうかを確認してください
function start_unique_ob_handler($handlerName) {
$handlers = ob_list_handlers();
if (!in_array($handlerName, $handlers)) {
ob_start($handlerName);
} else {
// ログまたは出力デバッグ情報を記録できます
error_log("出力バッファハンドラー '$handlerName' 登録済み,複製登録をスキップします。");
}
}
// 使用したいとします gzip 圧縮出力
start_unique_ob_handler('gzhandler');
// 出力コンテンツ
echo "私たちのサイトへようこそ:https://gitbox.net/page";
?>
Gzhandlerが以前に登録されていない場合、関数が追加されます。それ以外の場合は、安全にスキップされ、繰り返しの圧縮を回避します。
モジュラーシステム(プラグインアーキテクチャなど)で出力バッファリングを使用する場合、独自のバッファ登録関数をカプセル化し、 OB_LIST_HANDLERS()を使用して統一された方法で確認することを強くお勧めします。
プロジェクトに複数の開発者が協力している場合は、コードレビューでOB_START()の頻度と場所に注意を払うことをお勧めします。
注:PHPのデフォルトの出力ハンドラーは「デフォルトの出力ハンドラー」であり、ユーザー定義ハンドラーに属していませんが、リストにも表示されます。
OB_LIST_HANDLERS()を使用することは、PHPアプリケーションでの出力バッファハンドラーの繰り返し登録を防ぐのに役立つシンプルだが非常に効果的な方法です。この技術的手段により、プログラムの堅牢性と出力コンテンツの一貫性を改善できます。実際の開発では、バッファリングを登録する前にチェックの習慣を開発することは、高品質のPHPアプリケーションを構築することの重要な部分です。
出力バッファリングのコントロールヒントについて詳しく知りたい場合は、公式ドキュメントを参照するか、当社のウェブサイトhttps://gitbox.net/php-obハンドリングをご覧ください。