cURL: PHP并发处理方式

function classic_curl($urls, $delay) { 
    $queue = curl_multi_init(); 
    $map = array(); 
  
    foreach ($urls as $url) { 
        // create cURL resources 
        $ch = curl_init(); 
  
        // set URL and other appropriate options 
        curl_setopt($ch, CURLOPT_URL, $url); 
  
        curl_setopt($ch, CURLOPT_TIMEOUT, 1); 
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
        curl_setopt($ch, CURLOPT_HEADER, 0); 
        curl_setopt($ch, CURLOPT_NOSIGNAL, true); 
  
        // add handle 
        curl_multi_add_handle($queue, $ch); 
        $map[$url] = $ch; 
    } 
  
    $active = null; 
  
    // execute the handles 
    do { 
        $mrc = curl_multi_exec($queue, $active); 
    } while ($mrc == CURLM_CALL_MULTI_PERFORM); 
  
    while ($active > 0 && $mrc == CURLM_OK) { 
        if (curl_multi_select($queue, 0.5) != -1) { 
            do { 
                $mrc = curl_multi_exec($queue, $active); 
            } while ($mrc == CURLM_CALL_MULTI_PERFORM); 
        } 
    } 
  
    $responses = array(); 
    foreach ($map as $url=>$ch) { 
        $responses[$url] = callback(curl_multi_getcontent($ch), $delay); 
        curl_multi_remove_handle($queue, $ch); 
        curl_close($ch); 
    } 
  
    curl_multi_close($queue); 
    return $responses; 
}


function rolling_curl($urls, $delay) { 
    $queue = curl_multi_init(); 
    $map = array(); 
  
    foreach ($urls as $url) { 
        $ch = curl_init(); 
  
        curl_setopt($ch, CURLOPT_URL, $url); 
        curl_setopt($ch, CURLOPT_TIMEOUT, 1); 
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
        curl_setopt($ch, CURLOPT_HEADER, 0); 
        curl_setopt($ch, CURLOPT_NOSIGNAL, true); 
  
        curl_multi_add_handle($queue, $ch); 
        $map[(string) $ch] = $url; 
    } 
  
    $responses = array(); 
    do { 
        while (($code = curl_multi_exec($queue, $active)) == CURLM_CALL_MULTI_PERFORM) ; 
  
        if ($code != CURLM_OK) { break; } 
  
        // a request was just completed -- find out which one 
        while ($done = curl_multi_info_read($queue)) { 
  
            // get the info and content returned on the request 
            $info = curl_getinfo($done['handle']); 
            $error = curl_error($done['handle']); 
            $results = callback(curl_multi_getcontent($done['handle']), $delay); 
            $responses[$map[(string) $done['handle']]] = compact('info', 'error', 'results'); 
  
            // remove the curl handle that just completed 
            curl_multi_remove_handle($queue, $done['handle']); 
            curl_close($done['handle']); 
        } 
  
        // Block for data in / output; error handling is done by curl_multi_exec 
        if ($active > 0) { 
            curl_multi_select($queue, 0.5); 
        } 
  
    } while ($active); 
  
    curl_multi_close($queue); 
    return $responses; 
}

 

posted @ 2013-08-28 15:13  北斗极星  阅读(583)  评论(0编辑  收藏  举报