2011-04-18 3 views
2

コンソールでPHPスクリプトを実行すると、スクリプトが実行されている間、そのスクリプトの標準出力テキストがすべてコンソールウィンドウに表示されます。スクリプトの終わりにすべての出力をダンプするのではなく、長いPHPスクリプトが実行されている間にブラウザウィンドウで同様にブラウザで状況レポートを受け取ることは可能ですか?Webサーバーは、拡張された出力ストリームの出力でHTTP要求に応答できますか?

+0

もちろん、出力バッファリングをオフにしてから、ステータスメッセージを定期的に出力するようにしてください。サーバがバッファフラッシュ要求を上書きしない限り、クライアントにそれらのメッセージが表示されます。しかし、最高のところでは、バッファのフラッシュ/オーバーライドは、バッファとフラッシュする必要があるサーバーと基礎となるOSへの唯一の提案です。 –

答えて

4

はい。単にflush()とob_flush()を定期的に呼び出してください。ブラウザとの接続を維持するには、少なくとも120秒ごとに出力を書き込むことが重要です。

ラフ例:

while(!$done) { 
     //doWork(); 
     echo number_format(100 * ($workDone/$workTotal)) . "% "; 
     flush(); 
     ob_flush(); 
    } 

編集:ここに私のENVで動作概念の任意の証明があります:あなたが持っている場合

print('hello'); 
print(str_repeat(".\n", 2048)); 
flush(); 
//this might be a safe way to only flush the buffer if necessary? 
if(ob_get_length()) 
    ob_flush(); 
sleep(60); 
+0

動作しませんでした。 [this](http://pastebin.com/LzeTUnzi)のコードでは、ロードを開始する前に[this](http://pastebin.com/27qkdkYD)関数を呼び出すので、ユーザーはすぐにこのテキストを表示すべきではありませんブラウザはアドレスをロードしますか? – Hubro

+0

奇妙なことに、いくつかの簡単な例を試したところ、少なくとも1つの改行を受け取った後にGoogle Chromeが出力を表示するように見える(flush()のmanページには、表示する前に少なくとも256バイトのデータを必要とする)。フラッシュの前にエコーに改行(およびおそらくいくつかのパディング)を追加してみてください。 –

+0

私はChromeにも256バイトの要件があると言います。何も出力しない唯一のケースは、何もしないob_flushで長い警告を受け取ったときでした。 – Hubro

0

はい、一つのこと、あなたは心配する必要があります特に長い実行時間がタイムアウトしています。これは、PHPのタイムアウトやブラウザのタイムアウト(通常は約2分)として発生する可能性があります。

このPHPのドキュメントconnection handlingには、接続を維持するためのかなりの情報があります。

関連する問題