2017-03-16 8 views
0

PHP出力バッファを正しくフラッシュするには?

コンソールログ...私はJavascriptに出力をストリーミングするためにPHPを必要としますがJavascriptが古いレスポンスを維持し、そのようにそれらを出力しますので、JavaScriptコンソールはresponseTextは「保存」されている状態を記録します

[0]: Line to show. 
[0]: Line to show.[1]: Line to show. 
[0]: Line to show.[1]: Line to show.[2]: Line to show. 
[0]: Line to show.[1]: Line to show.[2]: Line to show.[3]: Line to show. 
[0]: Line to show.[1]: Line to show.[2]: Line to show.[3]: Line to show.[4]: Line to show. 

[0]: Line to show.[1]: Line to show.[2]: Line to show.[3]: Line to show.[4]: Line to show.Array 
(
    [0] => [0]: Line to show. 
    [1] => 
    [2] => 
    [3] => [1]: Line to show. 
    [4] => 
    [5] => 
    [6] => [2]: Line to show. 
    [7] => 
    [8] => 
    [9] => [3]: Line to show. 
    [10] => 
    [11] => 
    [12] => [4]: Line to show. 
    [13] => 
    [14] => 
) 

古い応答。しかし、私がPHPで保存した配列を見て、以前のエコーがJSにフラッシュされていないことがわかります。

Javascriptを:

   $.ajax({ 
        url: "../controller/controller.php", 
        type: "POST", 
        data: {operation: 'rxMode'}, 
        xhr: function(){ 
         var xhr = $.ajaxSettings.xhr(); 
         xhr.onprogress = function(e){ console.log(e.currentTarget.responseText); }; 
         console.log(xhr); 
         return xhr; 
        } 
       }); 

PHP:私はむしろ私はJavascriptを好むだろう古い応答を削除したくない:

 $out = array(); 
     for ($i = 0; $i<5; $i++){ 
      echo "[$i]: Line to show."; 
      array_push($out, ob_get_contents()); 
      ob_flush(); 
      array_push($out, ob_get_contents()); 
      flush(); 
      array_push($out, ob_get_contents()); 
      sleep(2); 
     } 
     print_r($out); 

私の希望responseTextが

[0]: Line to show. 
[1]: Line to show. 
[2]: Line to show. 
[3]: Line to show. 
[4]: Line to show. 

編集です私の希望するresponseTextだけを与えます。

+0

PHP配列を削除してprint_rを実行しても問題が解決されない場合は、デバッグ用です。 –

+0

次の応答の前にxhr varをクリアしてみてください。 'remove'コマンドと同様です。 **しかし**あなたはxhr宣言から 'var'を削除する必要があります。 – Soaku

+0

変数を削除して何を意味するのか不明です。それはjQueryのajaxラッパーにあるので、それを削除するとajaxが間違った変数を指してしまうでしょう?? –

答えて

2

responseTextには、常にサーバーからの応答がすべて含まれています。 progressイベントを使用すると、サーバーからの最新のフラッシュでレスポンスに追加された増分文字列だけでなく、これまでの累積レスポンスが格納されます。

変数に前の応答テキストの長さを保存し、その後の呼び出しでそれ以降の部分文字列を出力するだけです。

var responseLen = 0; 
$.ajax({ 
    url: "../controller/controller.php", 
    type: "POST", 
    data: {operation: 'rxMode'}, 
    xhr: function(){ 
     var xhr = $.ajaxSettings.xhr(); 
     xhr.onprogress = function(e){ 
      console.log(e.currentTarget.responseText.substr(responseLen)); 
      responseLen = e.currentTarget.responseText.length; 
     }; 
     console.log(xhr); 
     return xhr; 
    } 
}); 
+0

解決してくれてありがとうございますが、症状ではなく問題の原因を解決する答えを期待していました。 PHPと私のApacheサーバーとの間でJavascriptの何かが古い応答を保存し、Javascriptにフラッシュされることがあります。ありがたいことにJSの変数には制限はありませんが、このサーバーを数日間実行しても、この文字列レスポンスを無限ループでストリーミングし続けると、非常に速く大規模になります。 –

+0

ブラウザが保存しています。 'responseText'はこれまでに受け取った全体の応答で、PHPの最近のフラッシュからのビットだけではありません。 – Barmar

+0

XHRではなくWebSocketsのようなものを使用する必要があるようです。 – Barmar

関連する問題