如何在php中同步多个curl_multi请求?

时间:2011-04-20 16:56:55

标签: php curl curl-multi

我想使用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 个答案:

答案 0 :(得分:0)

你尝试过吗? 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);