2017-01-25 11 views
0

のために、リアルタイムで複数の値を返す:、PHP AJAX、私が持っているどのようなループ

foreach ($contacts as $contact) { 
     $this->StocklistMailer($contact, $weekOrDay, $data, $content, $itemGroup); 
     return new Response($contact->getEmail, 204); 
    } 

    return new Response('completed', 204); 

そしてそれは、ページ上のAJAX呼び出しに戻ります:私が望む何

foreach ($contacts as $contact) { 
     $this->StocklistMailer($contact, $weekOrDay, $data, $content, $itemGroup); 
    } 

    return new Response('completed', 204); 

です私がこれを達成したいのは、電子メールを誰に送信したのかをリアルタイムでフィードバックしたいからです。

+0

すべての電子メールを配列で収集し、それをクライアントvai jsonに渡します。 –

+0

[server-sent events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events)が必要なようなサウンドです。 – lonesomeday

+0

AFAIkでは、一度に1つの応答しか返すことができないので、データを収集して配列を返すか、javascriptでforループを実行して、すべての連絡先に対してajax呼び出しを行います。それにもかかわらず、これは**リアルタイム**ソリューションではありません。あなたはWebSocketのような異なるアプローチに目を通すべきです。 – lordrhodos

答えて

0

アプリケーションから複数の応答を送信することはできません。考えられるのは、1つの応答のみを生成するということです。

ただし、必要なすべての情報を1つの応答に入れることができます。私は200(OK)に204(ノーコンテンツ)を変更し

$emails = []; 
foreach ($contacts as $contact) { 
    $this->StocklistMailer($contact, $weekOrDay, $data, $content, $itemGroup); 
    $emails[] = $contact->getEmail; 
} 

return new Response(json_encode($emails), 200); 

注意。

0

複数の呼び出しに分割する必要があります。

最初の呼び出しでは、JavaScript配列に格納する連絡先の配列が返されます。 (このPHPファイルを呼び出すためにクライアントサイドJS/Ajaxを使用していると仮定します)。

その後、配列をループし、phpに一度に各連絡先を渡しながら、多くの連絡先が配列内にあるようにphpを呼び出します。

あなたは、配列をループしているようあなたは空想のプログレスバーを表示することができます:)

0

をあなたはそれではなく、symfonyのから行うことができます。 ReactPHP、ラチェットおよび関連技術を調べてください。

あなたはsymfonyアプリケーションからのメッセージをlocalhostで待機しまうのWebSocketサーバーを作成することができますし、ブラウザにWebSocketをを使用してリダイレクトされます。

cliendは、WebsocketサーバーとのWebSocket接続を開き、アプリケーションに要求を送信します。アプリケーションが処理中に、ローカルマシン上のソケットを使用してwebsocketサーバーに進行状況を送信しています。クライアントはwebsocketから進行状況をリアルタイムで取得する必要があり、それを表示する必要があります。

このようにして、リアルタイムでインタラクティブなインターフェースを得ることができます。

rabbitmq workerを作成するとメールが送信され、進行状況がwebsocketsサーバーに報告されます。 Symfonyアプリケーションから作業者用のタスクを作成するので、PHP要求の実行時間制限に制限されません。 rabbitmqワーカーのもう一つの勝利は、あなたが好きなだけ(または好きなだけ)持つことができるということです。そのため、タスクはキューに入れられ、一度にメールを生成して送信する50のプロセスでサーバーリソースを焼き付けません。

関連する問題