PHP Utiliser multi_curl pour créer plusieurs requêtes POST


Exemple

Parfois, nous devons faire beaucoup de requêtes POST vers un ou plusieurs points de terminaison différents. Pour faire face à ce scénario, nous pouvons utiliser multi_curl .

Tout d'abord, nous créons le nombre de requêtes nécessaires exactement de la même manière que dans l'exemple simple et les mettons dans un tableau.

Nous utilisons le curl_multi_init et y ajoutons chaque handle.

Dans cet exemple, nous utilisons 2 points de terminaison différents:

//array of data to POST
$request_contents = array();
//array of URLs
$urls = array();
//array of cURL handles
$chs = array();

//first POST content
$request_contents[] = [
    'a' => 'apple',
    'b' => 'banana'
];
//second POST content
$request_contents[] = [
    'a' => 'fish',
    'b' => 'shrimp'
];
//set the urls
$urls[] = 'http://www.example.com';
$urls[] = 'http://www.example2.com';

//create the array of cURL handles and add to a multi_curl
$mh = curl_multi_init();
foreach ($urls as $key => $url) {
    $chs[$key] = curl_init($url);
    curl_setopt($chs[$key], CURLOPT_RETURNTRANSFER, true);
    curl_setopt($chs[$key], CURLOPT_POST, true);
    curl_setopt($chs[$key], CURLOPT_POSTFIELDS, $request_contents[$key]);

    curl_multi_add_handle($mh, $chs[$key]);
}

Ensuite, nous utilisons curl_multi_exec pour envoyer les requêtes

//running the requests
$running = null;
do {
  curl_multi_exec($mh, $running);
} while ($running);

//getting the responses
foreach(array_keys($chs) as $key){
    $error = curl_error($chs[$key]);
    $last_effective_URL = curl_getinfo($chs[$key], CURLINFO_EFFECTIVE_URL);
    $time = curl_getinfo($chs[$key], CURLINFO_TOTAL_TIME);
    $response = curl_multi_getcontent($chs[$key]);  // get results
    if (!empty($error)) {
      echo "The request $key return a error: $error" . "\n";
    }
    else {
      echo "The request to '$last_effective_URL' returned '$response' in $time seconds." . "\n";
    }

    curl_multi_remove_handle($mh, $chs[$key]);
}

// close current handler
curl_multi_close($mh);

Un retour possible pour cet exemple pourrait être:

La demande de « http://www.example.com » a renvoyé «fruits» en 2 secondes.

La demande de ' http://www.example2.com ' a renvoyé 'seafood' en 5 secondes.