2009-03-18 26 views
2

私はPHPの出力バッファリングについて混乱しているようです。私はこのようなコードを持っています:PHPで出力バッファリング?

function return_json($obj) { 
    ob_get_clean(); 
    ob_start(); 
    header("Content-Type: application/json"); 
    echo json_encode($obj); 
    exit; 
} 

しかし、それはob_get_clean()が好きではないようです。私はそれをする前に誤ってHTMLが生成されるかもしれないが、それはあなたがそれをやる方法だったと思ったからです。

私には何が欠けていますか?

+0

これは間違っていますか? 「ob_get_clean()」が気に入らないように見えるのはどういう意味ですか?すでにヘッダーが送信されているとしますか? JSON出力が得られない場合は、関数内のob_start()を削除する必要があります。 – GrGr

+0

JSON呼び出しにエラーが発生しています。リターンペイロードがないようです。 – Jordie

+0

私はそれが正しいとすれば、あなたはスクリプトの出力が何であるか分からないのですか? FireBugを使用していますか?テストのためだけにContent-TypeをいくつかのHTMLishのものに置き換え、スクリプトを直接呼び出します。 – GrGr

答えて

7

使用ob_get_level() functionは、出力バッファがアクティブであるかどうかを確認し、それを終了するには:

while (ob_get_level()) { 
    ob_end_clean(); 
} 
+0

非常にエレガントです。 – mokiSRB

3

あなたはその関数が(ob_get_clean使用するには

+0

私はスクリプトの最初にob_start()を実行します – Jordie

+0

ob_get_clean()の前にする必要があります – Johan

9

と呼ばれる前に、任意の出力をキャッチするために、すべてのコードの前のob_startをしなければならない)、あなたは(いくつかの点で、あなたがのob_startしていることを、確認する必要があり ')ED早くそれ以外の場合は、クリーンアップするバッファがなく、すべてがすでにユーザエージェントにフラッシュされています。

1

あなただけ

ob_start() 

使用して出力バッファリングを開始した後、バッファをきれいにしたい場合は

ob_clean() 

も何もすでになど、エコー、ますprint_r、などの関数でフラッシュされていないことに注意してくださいしたがって、スクリプトの最初のものはob_start()でなければなりません。あなたのインクルードがまだ何かをブラウザに送っていないことを確認してください。

0

コンテンツが生成される前にob_startを呼び出す必要があります。

ob_start(); 
# generated content here 

$content = ob_get_contents(); # $content now contains anything that has been output already 
ob_end_clean(); 

# generate any headers you need 
echo $content; 
0

あなたが持っている問題は何も出力に行くされていないということであれば、何かのように通常の使用は次のようになりますあなたはフラッシュメソッドが欠けているようですか?また、ob_end_clean()は、出力バッファリングが開始された後にのみ呼び出すことができます。それ以外の場合は、 'false'を返します。すでに発行されている既存のヘッダーは、ob_メソッドを使用してクリーンアップすることはできません。自分で確認する必要があります。

function return_json($obj) { 
    ob_start(); 
    header("Content-Type: application/json"); 
    echo json_encode($obj); 
    ob_end_flush(); 
    exit; 
} 
+0

これは問題ではないようですが、私は未知の(yahoo)のコードをテストし、PHPは正常終了時にフラッシュします。残念ながら、彼は私たちに彼の出力が何であるかを教えてくれません。 – GrGr