PHPでは、メカニズムを使用すると、スクリプトによるデータ出力を傍受したり、変更したり、送信を遅らせたりできます。通常、 ob_start()を使用して、コールバック関数を渡すことにより、キャッシュを有効にし、出力コンテンツの処理をカスタマイズします。
OB_LIST_HANDLERS()関数を使用して、現在のすべてのアクティビティ出力ハンドラーを表示できます。
この記事では、実用的な例を使用して、 OB_LIST_HANDLERS関数を介してキャッシュチェーンを理解し、独自のハンドラーを挿入する方法を示します。
ob_list_handlers()は、現在アクティブ化されているすべての出力バッファープロセッサをリストする配列を返します。たとえば、 GZIP圧縮モジュールを有効にした場合、 OB_GZHandlerのようなプロセッサ名が表示される場合があります。
例:
<?php
// デフォルトの出力キャッシュをオンにします
ob_start();
// 現在の出力ハンドラーを確認してください
print_r(ob_list_handlers());
ob_end_flush();
?>
出力は次のとおりです。
Array
(
[0] => default output handler
)
他のカスタムプロセッサがない場合、通常、デフォルトの出力ハンドラーのみが表示されます。
ob_start()を使用して、出力がブラウザに送信される前に処理されるカスタムコールバック関数を渡すことができます。
簡単な例を次に示します。すべての出力小文字を大文字に変えるプロセッサを定義します。
<?php
// カスタムハンドラーを定義します
function custom_uppercase_handler($buffer) {
// 出力コンテンツを処理します,たとえば、すべての小文字を大文字に変えます
return strtoupper($buffer);
}
// キャッシュチェーンにカスタムハンドラーを挿入します
ob_start('custom_uppercase_handler');
// アナログ出力
echo "訪問してください https://gitbox.net テストページ!";
ob_end_flush();
?>
出力結果:
訪問してください HTTPS://GITBOX.NET テストページ!
ご覧のとおり、すべての小文字は、URLのドメイン名gitbox.netを含む大文字に変換されています。
PHPの出力キャッシュは、多層ネスティングをサポートします。 ob_start()を複数回呼び出すことができ、各レイヤーは異なる処理機能を指定できます。
例:
<?php
// 最初のハンドラー:コンテンツをキャピタルに変換します
function handler_upper($buffer) {
return strtoupper($buffer);
}
// セカンドハンドラー:特定の単語を置き換えます
function handler_replace($buffer) {
return str_replace('GITBOX.NET', 'gitbox.net', $buffer);
}
// 最初のプロセッサをオンにします
ob_start('handler_upper');
// 2番目のプロセッサをオンにします
ob_start('handler_replace');
// 出力コンテンツ
echo "訪問してください https://gitbox.net テストページ!";
// トッププロセッサと出力をオフにします
ob_end_flush();
// 低いプロセッサをオフにします
ob_end_flush();
?>
この例では:
Handler_Replaceは最初に実行され、文字列を置き換えます。
Handler_upperを実行した後、処理されたコンテンツは大文字に変換されます。
したがって、最終出力は次のとおりです。
訪問してください HTTPS://gitbox.net テストページ!
Handler_ReplaceはHandler_upperの前に実行されるため、交換操作は大文字の変換の影響を受けません。
OB_LIST_HANDLERS()を使用して、デバッグ中にカスタムプロセッサが正しく挿入されているかどうかを判断するなど、プログラム内の出力処理チェーンを動的に確認できます。
<?php
ob_start('custom_uppercase_handler');
$handlers = ob_list_handlers();
print_r($handlers);
ob_end_flush();
?>
出力:
Array
(
[0] => custom_uppercase_handler
)
カスタムプロセッサが正常に挿入されたことを指示します。
OB_START()を使用して、カスタムハンドラーを出力キャッシュチェーンに挿入します。
ob_list_handlers()は、現在アクティブなキャッシュプロセッサをすべて表示するために使用され、キャッシュチェーンのデバッグを支援します。
ob_start()は、多層処理チェーンを形成し、プロセッサコールの順序に注意を払うことができます。
出力を処理するときは、予期しない問題が発生しないように、コンテンツのエンコード形式とケースの変更に注意することを忘れないでください。
出力キャッシュメカニズムを合理的に使用することにより、コンテンツフィルタリング、動的圧縮、出力の遅延、その他の機能など、PHPプログラムの柔軟性を大幅に向上させることができます。