简体   繁体   中英

How to synchronize multiple curl_multi request in php?

i want to use curl_multi to perform some asynchronous requisitions, but i want to make a group of requisitions at the time, because when the response of the requisitions fullfills my needs i intend to stop the all the request. Here is my code:

//chunks the array into minor arrays
$chunks = array_chunk($likes, 8);
//Counter var
$cont = 0;
//Array of results
$ofertas = array();
foreach ($chunks as $likes)      
{
   $codCategoria = $categorias[$categoria];      
   //In this function 'getOfertas' is the multi_curl request
   $respostas = getOfertas($likes, $codCategoria);        
   //Iterates in the array of results of the multi_curl      
   foreach ($respostas as $json)      
   {   
       $resposta = json_decode($json, true);
       //If the json obtained is no empty     
       if ($resposta['num_and'] > 0)    
       {
           echo "cont: $cont <br>";
           //Increment counter and put the response into the array $ofertas
           $cont++;
           $i = array_rand($resposta['ofertas']);
           $oferta = $resposta['ofertas'][$i];
           array_push ($ofertas, $oferta);
           //If i have already 4 ou more results exit the loop, because i only need 4 of then
           if ($cont >= 4)
              break; 
       }

    }
}

return $ofertas;

Here is the function inside getOfertas() with the curl_multi code

function parallelGet($urls)
{
    print_r($urls);
    $res = array();
    // Create get requests for each URL
    $mh = curl_multi_init();
    foreach($urls as $i => $url)
    {
      $ch[$i] = curl_init($url);
      curl_setopt($ch[$i], CURLOPT_RETURNTRANSFER, 1);
      curl_multi_add_handle($mh, $ch[$i]);
      #echo "request ";
    }

    // Start performing the request
    do {
        $execReturnValue = curl_multi_exec($mh, $runningHandles);
    } while ($execReturnValue == CURLM_CALL_MULTI_PERFORM);
        // Loop and continue processing the request
    while ($runningHandles && $execReturnValue == CURLM_OK) {
      // Wait forever for network
      $numberReady = curl_multi_select($mh);
      if ($numberReady != -1) {
        // Pull in any new data, or at least handle timeouts
        do {
          $execReturnValue = curl_multi_exec($mh, $runningHandles);
        } while ($execReturnValue == CURLM_CALL_MULTI_PERFORM);
      }
    }

    // Check for any errors
    if ($execReturnValue != CURLM_OK) {
      trigger_error("Curl multi read error $execReturnValue\n", E_USER_WARNING);
    }

    // Extract the content
    foreach($urls as $i => $url)
    {
      // Check for errors
      $curlError = curl_error($ch[$i]);
      if($curlError == "") {
        $res[$i] = curl_multi_getcontent($ch[$i]);
      } else {
        print "Curl error on handle $i: $curlError\n";
      }
      // Remove and close the handle
      curl_multi_remove_handle($mh, $ch[$i]);
      curl_close($ch[$i]);
    }
    // Clean up the curl_multi handle
    curl_multi_close($mh);

    // Print the response data
    return $res;
}

did you try http://www.phpclasses.org/package/4091-PHP-Retrieve-multiple-pages-simultaneously.html

you should extend and implement method for callback event

/**
     * OnLoad callback event.
     *
     * @param string $url URL for downloading.
     * @param string $content Downloaded content.
     * @param array $info CURL session information.
     */
    protected abstract function onLoad($url, $content, $info);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM