コンソールでPHPスクリプトを実行すると、スクリプトが実行されている間、そのスクリプトの標準出力テキストがすべてコンソールウィンドウに表示されます。スクリプトの終わりにすべての出力をダンプするのではなく、長いPHPスクリプトが実行されている間にブラウザウィンドウで同様にブラウザで状況レポートを受け取ることは可能ですか?Webサーバーは、拡張された出力ストリームの出力でHTTP要求に応答できますか?
答えて
はい。単に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);
動作しませんでした。 [this](http://pastebin.com/LzeTUnzi)のコードでは、ロードを開始する前に[this](http://pastebin.com/27qkdkYD)関数を呼び出すので、ユーザーはすぐにこのテキストを表示すべきではありませんブラウザはアドレスをロードしますか? – Hubro
奇妙なことに、いくつかの簡単な例を試したところ、少なくとも1つの改行を受け取った後にGoogle Chromeが出力を表示するように見える(flush()のmanページには、表示する前に少なくとも256バイトのデータを必要とする)。フラッシュの前にエコーに改行(およびおそらくいくつかのパディング)を追加してみてください。 –
私はChromeにも256バイトの要件があると言います。何も出力しない唯一のケースは、何もしないob_flushで長い警告を受け取ったときでした。 – Hubro
はい、一つのこと、あなたは心配する必要があります特に長い実行時間がタイムアウトしています。これは、PHPのタイムアウトやブラウザのタイムアウト(通常は約2分)として発生する可能性があります。
このPHPのドキュメントconnection handlingには、接続を維持するためのかなりの情報があります。
- 1. 要求はサーバーに届いていますか?出力ストリーム
- 2. Spring MVC 3.1コントローラのハンドラメソッドで応答出力ストリームに直接ストリーム
- 3. サーバー要求なしで応答する$ http要求と応答を返す
- 4. 出力ストリームで作成されたバイナリ出力ファイルの内容
- 5. のHttp梨要求のgzip出力
- 6. console.logのHTTP GETリクエストからの応答を出力できません
- 7. NodeJS要求ストリーム応答
- 8. HTTP応答が要求されたときの非ブロック化オプション
- 9. 複数のHTTP要求ボディ出力をrestsharpでフォーマットする
- 10. gpxpyでto_xml()の拡張機能が出力されない
- 11. Perlで拡張SNMP出力を取得できません
- 12. シリアル化されたprotobuf出力のファイル拡張子
- 13. ターミナルで出力されたテラフォームテンプレートを出力しますか?
- 14. Cの拡張で複数の出力を返しますか?
- 15. Webサーバー:ストリームからHTTP要求を読み取る
- 16. Firefoxの拡張機能でHTTP応答をダンプできますか?
- 17. ノードHTTPサーバーで新しい要求応答を送信
- 18. IObservable出力は入力前に出力されますか?
- 19. ノードJSでサーブレット応答の出力ストリームを読み取る方法は?
- 20. Twisted [autobahn] websocketサーバーでリアルタイムに出力をストリームする方法は?
- 21. nodejsサーバーへのhttp同時要求は、同じ応答を
- 22. Angular2出力はES5で出力されますか?
- 23. $ httpサービスでJSONオブジェクトを返すPOST要求応答ですが、コントローラで呼び出されたときには定義されていません
- 24. Webサービスを呼び出すときに「空の応答で要求が失敗しました」
- 25. 応答を期待せずにサーバーにhttp要求を送信
- 26. Java出力ストリームが正しく出力されない
- 27. HTTP/2クライアント - 要求への応答を関連付ける - ストリームIDに頼ることができますか?
- 28. は、応答でWebサービスのHTTP POSTを呼び出し
- 29. 要求されたURLのファイル拡張子に、Webサーバー上で要求を処理するように構成されたハンドラがありません。
- 30. Django FileFieldは、フォーム出力要求でアップロードされたファイルを含まない
もちろん、出力バッファリングをオフにしてから、ステータスメッセージを定期的に出力するようにしてください。サーバがバッファフラッシュ要求を上書きしない限り、クライアントにそれらのメッセージが表示されます。しかし、最高のところでは、バッファのフラッシュ/オーバーライドは、バッファとフラッシュする必要があるサーバーと基礎となるOSへの唯一の提案です。 –