2017-01-07 19 views
0

私はcakephp 3でapiを作ろうとしています。このapiを使って、バッチEメールの情報をシステムに送ります。 apiリクエストをdatabseに格納した後、リクエストが受け取った確認応答を返し、バッチ処理を開始します。処理が終了したら、プロセスのステータスを返すコールバック応答を送信します。現在のコーディングシステムでは、処理を完了するまで待つ必要があります。私はそれをパラレルにするにはどうしたらいいですか?cakephp並列処理を行い、コールバックでAPI応答を返す方法は?

// Store api request to database 
    $saveQueue = EmailQueue::enqueue($to, $data, $options); 

    if ($saveQueue) { 
     $this->Flash->success('Request saved in queue.'); 

     $shell = new ShellDispatcher(); 
     $output = $shell->run(['cake', 'EmailQueue.sender']); 

     if (0 === $output) { 
      $this->Flash->success('Success from shell command.'); 
     } else { 
      $this->Flash->error('Failure from shell command.'); 
     } 
     return; 

    } 
    $this->Flash->error('Failed to save in queue.'); 

[私は実際の質問タイトルが何であるべきかわかりません、自由に編集してください。 :)]

+0

マルチスレッドhttp://stackoverflow.com/questions/70855/how-can-one-use-multi-threading-in-php-applications#answer-15501449を使用する必要があります。構文から私はあなたが** CakePHP Email Queueプラグインを使用していると仮定しました**あなたにもあまりにも言及してください。このプラグインを確認してくださいhttps://github.com/dereuromark/cakephp-queue –

答えて

1

システムは設計上問題があります。 Web環境でシェルを使用しないでください。彼らは理由が異なる2つの世界です。正直なところ、私はそのアプローチが間違っているが、ここで適切なsoltuionで他に何網羅的な説明を書くために怠惰によ:

  1. APIはPOST
  2. を介してデータを受信
  3. アプリケーションがタスクを作成し、キュー
  4. に入れます
  5. APIのようなもので応答し、バックグラウンド(NOTリクエスト中)でサーバー上で実行されます
  6. シェル、「キューに入れOKの仕事、ここではあなたの仕事のIDであるが、」キュー

を処理しています今はtw Oオプション:タスクが完了すると

  • アプリケーションが定義されたエンドポイントに、戻ってタスクを作成したシステムへのPOSTリクエストを送信し、タスクは、タスクを作成し
  • システムを実行されていることを通知しますすべてのX分間にあなたのAPIに対するGET要求が、キューに入れられたジョブが完了したかどうかを尋ね、返されたステータスを受け取る。これは、要求を制限するためにキャッシュされ、応答はキャッシュの有効期間を伝える必要があります。

まずはより良い解決策です。

キューのステータスに関するリアルタイムのリアルタイム情報を長時間実行したい場合は、もう1つの解決策はWebsocketsです。

関連する問題