PHP開発中、出力バッファーを操作またはデバッグする必要がある場合があります(出力バッファリング)。 ob_list_handlers()は、現在のすべてのアクティビティ出力バッファハンドラーを表示するために使用される関数です。ただし、多くの開発者は、この関数を使用するときに空の配列を返す状況に遭遇します。この記事では、この問題を詳細に分析し、効果的なソリューションを提供します。
OB_LIST_HANDLERS()は、PHPが提供する機能であり、現在アクティブな出力バッファープロセッサをリストする配列を返します。一般的なプロセッサには、デフォルトの出力ハンドラー、 GZIPハンドラー、 MB_OUTPUT_HANDLERなどが含まれます。
構文は次のとおりです。
array ob_list_handlers ( void )
戻り値:すべてのアクティブな出力バッファープロセッサ名を含む配列。
ob_list_handlers()が空の配列を返す可能性のあるいくつかの一般的な理由があります。
OB_LIST_HANDLERS()を呼び出す前に出力バッファリングが有効になっていない場合、当然プロセッサはなく、空の配列が返されます。
例:
print_r(ob_list_handlers()); // 出力:Array ( )
現時点では、バッファを有効にするOB_START()またはその他の関数はなく、バッファーは空です。
OB_END_CLEAN() 、 OB_END_FLUSH() 、およびその他の関数が、 ob_list_handlers()の呼び出しの前に呼び出された場合、バッファーをクリアまたは閉じることも、プロセッサを削除して空の配列を返します。
PHPの出力バッファリングメカニズムが自動的に有効になることがあります(たとえば、 output_buffering構成アイテムやZlibなどの他の拡張機能を介して)が、コードが実行されているときに他のロジックによってクリーンアップされている可能性があり、表示されます。
ob_list_handlers()を呼び出す前に、 ob_start ()が呼び出されることを確認してください。
ob_start();
print_r(ob_list_handlers());
ob_end_clean();
出力は次のとおりです。
Array
(
[0] => default output handler
)
function custom_handler($buffer) {
return strtoupper($buffer);
}
ob_start("custom_handler");
print_r(ob_list_handlers());
ob_end_clean();
出力:
Array
(
[0] => custom_handler
)
複数のプロセッサを追加して、スタッキング順序を表示することもできます。
php.iniで無効になっている関連するバッファリングメカニズムがないことを確認してください。たとえば、確認してください:
output_buffering = Off
zlib.output_compression = Off
有効にする:
output_buffering = On
構成を変更した後、Webサーバーを再起動します。
複雑な出力ロジックをデバッグすると、 OB_LIST_HANDLERS()を組み合わせて問題を見つけることができます。
例えば:
ob_start("ob_gzhandler");
ob_start();
echo "GitBox.net サンプルのウェブサイトです。";
print_r(ob_list_handlers());
ob_end_flush();
ob_end_flush();
出力は次のとおりです。
Array
(
[0] => default output handler
[1] => ob_gzhandler
)
これにより、論理エラーの処理とデバッグの順序を理解するのに役立ちます。
OB_LIST_HANDLERS()空の配列を常に返します。常にエラーがありません。通常、現在アクティブな出力バッファプロセッサがないことを意味します。誤解を避けるために、関数を使用する前に、必ず出力バッファリングが有効になっていることを確認してください。この問題は、ob_start()を呼び出すか、phpの構成オプションを表示することで効果的に解決できます。実際のプロジェクトでは、出力バッファリングの実用的な原則を理解することで、ページコンテンツの出力と処理をより柔軟に制御できます。
出力バッファリングの詳細については、 https://gitbox.net/docs/php-output-bufferingを参照してください。
テスト用に完全なデバッグスクリプトファイルも添付したいですか?