curl_multi_exec最大执行时间超过

问题描述:

我有以下功能,运行的网址与卷曲的数组:curl_multi_exec最大执行时间超过

function multiRequest($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_setopt($ch[$i], CURLOPT_HEADER, "Accept: application/json"); 
     curl_setopt($ch[$i], CURLOPT_HTTPAUTH, CURLAUTH_BASIC); 
     curl_setopt ($ch[$i], CURLOPT_SSL_VERIFYHOST, 0); 
     curl_setopt ($ch[$i], CURLOPT_SSL_VERIFYPEER, 0); 
     curl_multi_add_handle($mh, $ch[$i]); 
    } 

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

}

我得到这个错误:超过30秒的最大执行时间,它指向的行是$numberReady = curl_multi_select($mh); 在更新到5.5代码后,用于在PHP 5.3版上工作的代码不再有效。 我试图设置超过30秒的限制,它没有帮助,也尝试ini_set('max_execution_time',0); 我的代码有什么问题吗?有没有其他的方法来调试它?

这种替代功能解决了这个问题对我来说:

function multiRequest($nodes){ 
//function multiple_threads_request($nodes){ 
    $mh = curl_multi_init(); 
    $curl_array = array(); 
    foreach($nodes as $i => $url) 
    { 
     $curl_array[$i] = curl_init($url); 
     curl_setopt($curl_array[$i], CURLOPT_RETURNTRANSFER, true); 
     curl_setopt($curl_array[$i], CURLOPT_HEADER, "Accept: application/json"); 
     curl_setopt($curl_array[$i], CURLOPT_USERPWD, xxxx); 
     curl_multi_add_handle($mh, $curl_array[$i]); 
    } 
    $running = NULL; 
    do { 
     usleep(10000); 
     curl_multi_exec($mh,$running); 
    } while($running > 0); 

    $res = array(); 
    foreach($nodes as $i => $url) 
    { 
     $res[$url] = curl_multi_getcontent($curl_array[$i]); 
    } 

    foreach($nodes as $i => $url){ 
     curl_multi_remove_handle($mh, $curl_array[$i]); 
    } 
    curl_multi_close($mh);   
    return $res; 

}