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; 

}

 

你可能感兴趣的:(curl)