PHP開発では、出力がブラウザに送信されたときに出力バッファリングメカニズムを使用してしばしば使用されます。しかし、時には、 OB_LIST_HANDLERS()関数を呼び出すと、「すでに送信されているヘッダー」や「バッファスタックアンダーフロー」などのいくつかの一般的なエラーが発生します。
この記事では、これらのエラーに遭遇した理由と、問題を迅速に見つけて修正する方法を理解することができます。
OB_LIST_HANDLERS()は、現在アクティブな出力バッファハンドラー(ハンドラー)のすべての配列を返すPHP組み込み関数です。たとえば、 ob_start()を使用してバッファーを開くと、ハンドラーがスタックに押し込まれます。
簡単な例:
<?php
ob_start();
print_r(ob_list_handlers());
ob_end_clean();
?>
出力が似ている可能性があります。
Array
(
[0] => default output handler
)
問題の説明:
プログラムでob_end_clean()またはob_end_flush()を複数回実行すると、それほど多くのバッファーがありません。
Warning: ob_end_clean(): failed to delete buffer. No buffer to delete
原因分析:
これは、バッファスタックが空で、不必要なクリーニング機能が呼び出されたためです。
クイック修正:
クリーンアップを呼び出す前に、バッファーが存在するかどうかを確認できます。
<?php
if (ob_get_level() > 0) {
ob_end_clean();
}
?>
またはよりエレガントに安全な機能をカプセル化します:
<?php
function safeObEndClean() {
while (ob_get_level() > 0) {
ob_end_clean();
}
}
?>
問題の説明:
ヘッダー( header( '場所:https://gitbox.net/success'など)を設定する前に)、コンテンツが出力されている場合、PHPは次のようにプロンプトします。
Warning: Cannot modify header information - headers already sent
原因分析:
出力(スペースや目に見えない文字でさえ)があると、PHPはHTTP応答の送信を開始し、現時点では設定ヘッダー情報が無効であると考えるでしょう。
クイック修正:
PHPファイルの先頭にスペースや出力が絶対にないことを確認してください。
出力バッファリングを開始し、最後に均一に送信します。
例えば:
<?php
ob_start();
// 通常のロジック処理
header('Location: https://gitbox.net/welcome');
exit;
ob_end_flush();
?>
注:後続のコード実行を避けるために、リダイレクト後に出口が必要です。
問題の説明:
ob_start( 'nownwhandler')を使用する場合、存在しないハンドラーが指定されている場合、PHPはエラーを報告します。
Warning: ob_start(): output handler 'unknown_handler' cannot be used
原因分析:
ハンドラー名はPHP(GZIP圧縮のOB_GZHANDLERなど)に知られている必要があります。そうしないと、エラーがスローされます。
クイック修正:
プロセッサが存在するかどうかを確認し、再度登録してください。
<?php
if (function_exists('ob_gzhandler')) {
ob_start('ob_gzhandler');
} else {
ob_start();
}
?>
複雑なページに遭遇すると、バッファリングが複数回オンとオフになったときに、 OB_LIST_HANDLERS()を使用して現在のバッファープロセッサスタックを印刷して、通話関係を確認することができます。
例:
<?php
ob_start('ob_gzhandler');
ob_start();
print_r(ob_list_handlers());
ob_end_flush();
ob_end_flush();
?>
出力:
Array
(
[0] => ob_gzhandler
[1] => default output handler
)
混乱を避けるために、スタック注文に従ってOB_END _*()呼び出しを行います。
ほとんどの場合、バッファー管理または間違った出力のタイミングが原因であるため、 OB_LIST_HANDLERS関連のエラーに遭遇しました。このタイプの問題は、ob_get_level()を使用して正しく正しく回避し、ステータスを確認し、出力バッファーを合理的に管理することにより、効果的に回避できます。デバッグするとき、 ob_list_handlers()を使用してバッファスタックの状況をリアルタイムで観察することは、問題を迅速に配置するための強力なツールです。