2012-01-13 8 views
3

PHPでは、出力の一部がすでにクライアントに送信されているかどうかを確認する準備ができていますか?出力の一部が既にPHPで送信されているかどうか確認してください

私は、ヘッダがすでに送信されている場合headers_sent()であなたが確認することができることを知って、私はまた、任意の出力(例えばHTTPヘッダ> 0 Content-Lengthように)送られてきたかどうかを確認します。

ob_start()、それが呼ばれた瞬間から始まる出力バッファリング。しかし、私のコードを実装するサードパーティシステムが既にため、出力バッファリングは私の知る限り使用できない、出力を送信した可能性がある。注意してください)

+1

* get_headers()HTTP要求に応答してサーバによって送信されたヘッダを持つ配列を返す*(http://php.net/manual/en/function.get-headers。 .php) – Quasdunk

答えて

3

ob_startを他のものの周りにラップして、それをフラッシュすることができます。他のob_startとフラッシュが内部にあっても動作します。この例を取る:

ob_start(); 
[...] 
//some 3rd party app which is included on the way 
    [...] 
    ob_start(); 
    [...] 
    ob_flush(); //at this moment the buffer isn't flushed to the client 
       //but to the parent ob_start, which is yours, so no output 
       //is sent yet 
[...] 
//ok, we're done, we can output now 
ob_flush(); 
1

PHPはほとんどの場合、何らかのコンテンツまたはスクリプトの実行終了時にのみ、ヘッダーをApacheに送信します。したがって、ヘッダーが送信された場合、一部のコンテンツも送信されます。 Furthemoreは、私が理解するように、とにかくContent-Lengthがスクリプトの実行後に計算されます。

+0

私は全く同意しません。すべてのHTTP応答にメッセージ本文があるわけではありません。たとえば考えるリダイレクトの。 HTTPステータスコードとLocation-headerだけを送信します。だから、すべての反応が実際に実際の「内容」を含んでいるわけではない。そして、応答はPHPによってではなく、サーバーによって送られます。 PHPではヘッダなどを変更することしかできません。 – Quasdunk

+0

_sends headers_はPHPがApacheに送ることを意味します。私がこのことをあいまいに説明すると、私はごめんなさい。あなたの例のように、スクリプトが 'Location'ヘッダを設定すると、それはとにかく実行を終了します。ほとんどの場合、 'exit'または' die'を使用します。それで、この後、私が説明したように、ヘッダーが送信されます。私のメッセージの「スクリプトの実行終了時」に注意してください。 – Timur