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!
Aber dann verliere ich den Zweck hinter asynchronen Anfragen durch Warten auf jeden zu beenden, nicht wahr? – Daniel
Nein, Sie erstellen 4 Anfragen, erhalten (sofort) Versprechungen von jedem und warten auf alle von ihnen zu beenden. –
Sie warten also, wenn alle fertig sind. Aber sie werden alle gleichzeitig ausgeführt. –