2016-10-15 5 views
0

私はループで長い処理をしており、連続して進捗を出力したいと思います。私は多くの技術を試していないが、それでも運CakePHPでの連続出力

ini_set('output_buffering', 'off'); 
ini_set('zlib.output_compression', false); 
while (@ob_end_flush()); 
ini_set('implicit_flush', true); 
ob_implicit_flush(true); 

flush()を各サイクルで

$this->response->body(function() { /* loop with echo here */ } 

ラップループをまだブラウザはときに一度、すべてのデータを表示する

while (true) 
{ 
    $percents = $do_my_stuff(); 
    echo $percents; 
    $this->log($percents); 
} 

スクリプトは終了しました。レスポンスヘッダ:私はそれをどのように

HTTP/1.1 200 OK 
Host: localhost:8765 
Connection: close 
X-Powered-By: PHP/5.6.20 
Content-type: text/html; charset=UTF-8 

ビルトインサーバー./bin/cake serverを使用してPHP 5.6、CakePHPの3

を行うことができますか?私は、ユーザーが長い間実行できるので、操作の割合を見てほしい。

答えて

1

ブラウザーに表示する連続出力を強制する方法はありません。閉じた</html>タグを受け取るまで、一部のブラウザは表示されません。したがって、出力が機能していることを確認するには、ネットワークモニターを使用して、サーバーがストリーミングデータであるかどうかを確認する必要があります。

また、Cakeの応答オブジェクトは使用しないでください。これは出力をバッファリングし、クライアントに送信する前にイベントによって処理されるように使用されます。手動でデータを送信し、応答を終了する必要があります。

header("Content-Type: text/plain"); 
while (@ob_end_flush()); // Flush and disable output buffers 
for($a = 0; $a < 100; $a++) { 
    echo "X"; 
    flush(); // Flush output 
    sleep(1); 
} 
die; // end request here. 

長いタスクでは、クライアント側にプログレスバーを表示する場合。これはそれを行う方法ではありません。

セッションに進捗状況を書き込んで保存し、その進捗状況をAJAX経由でリクエストする必要があります。

+0

ありがとうございました。私は長時間実行されているコンソールタスクからのコンソール出力を表示したいので、一般的には「進捗状況」であり、進捗バーではありません。今私はファイルに出力を書き込むとAJAXを介してファイルの内容を読むことに終わったが、私はそのようなソリューションに満足していない。 – Yaroslav

+0

@ Yaroslavあなたは 'passthru'を使ってログファイルの末尾を流すことができます。ここに要点があります:https://gist.github.com/lorenzos/5cbf78a4447e1a98b59f – cgTag

関連する問題