Как синхронизировать несколько запросов curl_multi в php?

Я хочу использовать curl_multi для выполнения некоторых асинхронных заявок, но я хочу создать группу заявок в то время, потому что, когда ответ заявок полностью удовлетворяет мои потребности, я намерен остановить весь запрос. Вот мой код:

//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;

Вот функция внутри getOfertas() с кодом curl_multi

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;
}

1 ответ

Вы пробовали http://www.phpclasses.org/package/4091-PHP-Retrieve-multiple-pages-simultaneously.html

Вы должны расширить и реализовать метод для события обратного вызова

/**
     * 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);
Другие вопросы по тегам