2017-12-14 15 views
0

したがって、出力バッファリングを使用するアプリケーションがあり、アプリケーションが期待される結果に加えていくつかの余分なデータを返す場合があります。期待される結果が出力バッファに追加されているポイントを操作して、アプリケーションのこの時点で出力バッファに送信されるデータが正しいことを確認することができます。したがって、予期せぬ余分なデータが別のソースから来ている必要があります。出力バッファへの呼び出しを追跡する方法

私はこの問題がPHPスクリプトタグの中にない浮遊文字だと思っていますが、どのファイル(もしあれば)が原因であるのかわかりません。私が知っている限り、追加のデータを明示的にechoしているファイルが含まれている可能性があります。

私は出力バッファに書き込むファイルのファイル名と行番号を取得したいと考えていましたが、これは予想よりもはるかに困難であることがわかりました。私は最初のob_startがどこにあるか知っているので、私はカスタムoutput_callbackを使用しようとしてきました。ここで私はすでに試したいくつかのことです。

ob_start(function($string) { 
    return __FILE__ . ":" . __LINE__ . " : " $string; 
}); 

これは、関数が定義されているファイル名と行番号を返し、ないそれはから(予想通り、私は推測するが、悪いスタートを切ったと呼ばれた場所)。

ob_start(function($string) { 
    return print_r(debug_print_backtrace(), true) . " : " $string; 
}); 

これは、ラムダ関数の破壊に関するエラーをスローします。

​​

これは、結果が混在していました。なぜ私は完全にはわからないと認めます。しかし、ほとんどの場合、var_dumpは空の文字列(何もない)に解決されましたが、ある場合はトレース配列を生成するように見えましたが、ob_start呼び出しの起点を反映するものはありませんでした(つまり、実際にechoと呼ばれたソースファイルはトレースの一部ではありませんでした)。

上記の説明では、カスタムのoutput_callback機能をトラブルシューティングのコンテキストにドロップする準備ができたときに、その機能がどのように見えるかを理解するためにかなり基本的なテストを行ってきました。問題はアプリケーション固有ではないので、出力関数(エコー、プリントなど)を傍受し、その出力呼び出しの起点に関する情報を取得する一般的な方法を見つけることを試みています。

答えて

1

可能な解決策

あなたはあなたのコードが浮遊文字、下のソリューションを助けることができることを吐き出すために出力バッファリングを使用している場合。また、すべてのprint/echoステートメントではなく、出力バッファリングがフラッシュ/取得されたときにのみ機能することも正しいです。また、すべてのネイティブ関数がコールバック関数で機能せず、print_rのいずれかですが、Exceptionをスローすることができます。下記のコードを試して、問題の解決に役立つかどうかを確認してください。

ob_start(function($buffer) { 
    try { 
     $stackTrace = debug_print_backtrace(); 
     throw new \Exception($stackTrace, 1); 
    } catch (\Exception $ex) { 
     //This line can be logged to a file instead of appending to the buffer 
     $buffer .= PHP_EOL.$ex->getTraceAsString().PHP_EOL.PHP_EOL; 
    } 
    return $buffer; 
}); 

最初のソリューションは、あなたの問題を解決しない場合は、あなたがXdebug

のような高度なデバッグとプロファイリングツールを使用する場合があります

あなたが本当に気にしない場合は、abo現在の行の前にすでにエコーアウトされているコンテンツを削除したり、将来同様の問題が発生しないことを将来証明したい場合は、ob_startの前にob_end_cleanを使用してバッファをフラッシュしてください。

pcregrep -rMl '\?>[\s\n]+\z' * 

OR

pcregrep -rM '\?>[\s]+[^\S]*$' *.php 
+0

が、私はこれは、トラブルシューティングとして動作するとは思わない:終了タグの後に、すべてのPHPの空白を見つける

ob_end_clean(); ob_start(); 
ツールのために、1)どのfi lesは出力に寄与しているので(出力がどこから来ているのかを明確にすることはできません)、2)あなたの例では、fudgey出力が 'ob_start'の前に起こると仮定しています。カスタム拡張は、適切な 'ob_start'コンテンツの範囲内で出力に貢献するかもしれませんが、単純にエラーがあるか、そうでなければ出力できません。目標は、潜在的なアウトプットの発生元を特定することです。 – Anthony

+0

さらに多くのテストを行うと、出力バッファがフラッシュされたときにカスタムob_callback関数が呼び出されるようになりました。出力バッファが更新されるたびにコールバックをトリガする方法はありますか? – Anthony

+0

いつものように機能するように 'php:// output'ストリームをオーバーライドすることは可能でしょうか(または推奨するでしょうか?)また、トレースファイルに対して調整できるタイムスタンプや他の識別子をエラーログに送りますか? – Anthony

関連する問題