2017-05-03 11 views
0

を超えて私はcURLを持つURLの配列を実行し、以下の機能を持っている: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); です。PHPのバージョン5.3で動作するために使用されたコードは、5.5にアップデートした後、コードは動作しなくなりました。 私は30秒以上の制限を設定しようとしましたが、それはまた、ini_set( 'max_execution_time'、0)を試みました。 私のコードに何か問題はありますか?それをデバッグする別の方法がありますか?

答えて

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; 

}

関連する問題