2017-07-05 2 views
0

Ich versuche, 4 asynchrone Suchaufrufe (POST HTTP-Anfrage) zu machen, um 4 Datenbanktabellen gleichzeitig zu suchen, dann warten auf alle von ihnen zu beenden (asynchron), kombinieren Sie die Ergebnisse und sie an den Benutzer zurückgeben.Guzzle async POST-Anfragen nicht gesendet

Hier ist mein Code:

public static function async_search($search_words) 
{ 
    $curl = new CurlMultiHandler(); 
    $client = new Client([ 
     'base_uri' => 'https://mytestapi.com/', 
     'timeout' => 0, 
    ]); 

    $finished_promisesArr = array(
     'search1' => 0, 
     'search2' => 0, 
     'search3' => 0, 
     'search4' => 0, 
    ); 

    $bodyArr = array(
     'search_words' => $search_words, 
    ); 

    $search1_promise = $client->requestAsync('POST', 'search1', array(
     'form_params' => $bodyArr, 
    ))->then(
     function(ResponseInterface $response) { 
      echo 'got response'; 
      $finished_promisesArr['search1'] = 1; 
     }, 
     function (RequestException $e) { 
      $finished_promisesArr['search1'] = 1; 
     } 
    ); 

    $search2_promise = $client->requestAsync('POST', 'search2', array(
     'form_params' => $bodyArr, 
    ))->then(
     function(ResponseInterface $response) { 
      $finished_promisesArr['search2'] = 1; 
     }, 
     function (RequestException $e) { 
      $finished_promisesArr['search2'] = 1; 
     } 
    ); 

    $search3_promise = $client->requestAsync('POST', 'searchCompanies', array(
     'form_params' => $bodyArr, 
    ))->then(
     function(ResponseInterface $response) { 
      $finished_promisesArr['search3'] = 1; 
     }, 
     function (RequestException $e) { 
      $finished_promisesArr['search3'] = 1; 
     } 
    ); 

    $search4_promise = $client->requestAsync('POST', 'searchCompaniesByIndustries', array(
     'form_params' => $bodyArr, 
    ))->then(
     function(ResponseInterface $response) { 
      $finished_promisesArr['search4'] = 1; 
     }, 
     function (RequestException $e) { 
      $finished_promisesArr['search4'] = 1; 
     } 
    ); 

    $promisesAggregate = GuzzleHttp\Promise\all([$search1_promise, $search2_promise, $search3_promise, $search4_promise]); 
    foreach ($promisesAggregate as $agg) { 
     $curl->tick(); 
    } 

    $keep_running = true; 
    while ($keep_running) { 
     $all_processes_finished = true; 
     foreach ($finished_promisesArr as $promise => $status) { 
      if (!$status) { 
       $all_processes_finished = false; 
      } 
     } 

     if ($all_processes_finished) { 
      $keep_running = false; 
     } 
    } 

    return array(); 
} 

Bitte ignorieren Sie das leere Array in das Ergebnis und die Tatsache, dass ich tue nichts mit der Antwort. Ich habe Protokolle auf den Server-Methoden und sie werden nicht einmal aufgerufen, und die Schleife läuft unendlich weiter.

Beachten Sie, dass wenn ich die request Methode anstelle von requestAsync verwende, bekomme ich das richtige Ergebnis.

Irgendwelche Ideen hier?

Danke!

Antwort

0

Rufen Sie einfach $promisesAggregate->wait(), nachdem Sie es von GuzzleHttp\Promise\all Funktion bekommen.

Es bedeutet das gleiche wie Ihr Code, aber tut es richtig (Ihr Wartecode ruft ->tick() nur einmal und das ist der Fehler).

+0

Aber dann verliere ich den Zweck hinter asynchronen Anfragen durch Warten auf jeden zu beenden, nicht wahr? – Daniel

+0

Nein, Sie erstellen 4 Anfragen, erhalten (sofort) Versprechungen von jedem und warten auf alle von ihnen zu beenden. –

+0

Sie warten also, wenn alle fertig sind. Aber sie werden alle gleichzeitig ausgeführt. –