PHPの出力バッファリングメカニズムを使用する場合、 ob_start()やob_get_contents()などの関数を使用してコンテンツの出力を制御することがよくあります。これらのツールは、テンプレートエンジン、キャッシュ生成、ページ圧縮、その他のシナリオで非常に一般的です。ただし、誤って処理されると、キャッシュされたコンテンツが複数回出力される可能性があり、ページの通常の表示に影響します。
実用的だが見過ごされがちな関数の1つは、ob_list_handlers()です。現在有効になっているすべてのバッファハンドラーを表示するのに役立ちます。それを正しく使用すると、出力バッファーの問題が繰り返し出力されることを効果的に回避できます。
PHPの出力バッファーを使用すると、マニュアルフラッシュが完了するか、スクリプトが均一に出力されるまで、出力コンテンツをメモリに保存できます。これは私たちを助けることができます:
コンテンツを出力する前に、HTTPヘッダー情報を変更します。
キャッシュされたコンテンツを制御します。
出力コンテンツを圧縮またはフィルタリングします。
基本的な使用例は次のとおりです。
ob_start();
echo "Hello, World!";
$content = ob_get_contents();
ob_end_clean();
このコードでは、 「こんにちは、世界!」バッファーに出力され、変数$コンテンツとして抽出され、バッファーはOB_END_CLEAN()を介してクリアされ、直接出力されないようにします。
ob_list_handlers()すべての現在の出力バッファープロセッサ名を返します。これは、複製出力をトラブルシューティングする強力なツールです。
例えば:
ob_start();
ob_start('ob_gzhandler');
print_r(ob_list_handlers());
出力は次のとおりです。
Array
(
[0] => ob_gzhandler
[1] => default output handler
)
各プロセッサは、バッファー出力をスタック方法で処理します。古いバッファーをクリーニングしないと、コンテンツが繰り返し圧縮または出力される場合があります。
複雑なプロジェクトでは、複数のコンポーネントを使用する傾向があり、すべて独自の出力バッファリングをオンにする可能性があります。バッファレベルが統一されていない場合、次の問題は簡単に発生します。
キャッシュコンテンツ出力は複数回出力します。
出力順序は一貫性がありません。
バッファリングが正しく閉じられておらず、メモリリークが発生します。
ob_get_level()を使用して、現在のバッファレベルを検出し、繰り返しの呼び出しを避けます。
if (ob_get_level() === 0) {
ob_start();
}
ヘルパー関数を作成して、次のような特定のプロセッサが有効になっているかどうかを検出できます。
function has_ob_handler($handler_name) {
return in_array($handler_name, ob_list_handlers());
}
if (!has_ob_handler('ob_gzhandler')) {
ob_start('ob_gzhandler');
}
このコードにより、 OB_GZHANDLERが繰り返し登録されることを防ぐため、GZIPによって複数回圧縮される出力を回避します。
どのバッファーがオンになっているかわからない場合は、次の方法を使用してそれらをクリアできます。
while (ob_get_level() > 0) {
ob_end_clean();
}
これは、ネストされたバッファレベルが問題を引き起こすのを防ぐために、フレームワークまたはコアコントローラーでよく使用されます。
$url = 'https://gitbox.net/cache/homepage.html';
// バッファリングを開始します
if (ob_get_level() === 0) {
ob_start();
}
// アナログコンテンツ出力
echo "<h1>訪問してください Gitbox</h1>";
// キャッシュされたコンテンツを保存します
$content = ob_get_contents();
file_put_contents('/path/to/cache/homepage.html', $content);
// バッファリングの終了,出力コンテンツ
ob_end_flush();
スクリプトが複数回呼び出された場合(テンプレートシステムなど)、バッファリングを開始する前にOB_LIST_HANDLERS()を追加して、バッファリングが再起動されないことを確認し、キャッシュされたコンテンツの複数の出力または例外を回避できます。
OB_LIST_HANDLERS()を使用すると、現在の出力バッファリング状態を明確に理解することができ、キャッシュされた複製出力問題を見つけて修正するための重要なツールです。 OB_GET_LEVEL()やOB_END_CLEAN()などの関数を使用すると、特にテンプレートエンジン、ビルディングページキャッシュ、GZIP出力の処理を使用する場合、PHPの出力バッファリングをより安全かつ効率的に管理できます。
競合のリスクを減らし、コンテンツの出力をより制御可能かつ効率的にするために、大規模プロジェクトまたはマルチモジュールシステムの出力バッファリングロジックを統一することをお勧めします。
参照として完全なバッファ管理クラスのカプセル化を提供する必要がありますか?