curl_multi_exec超出最大执行时间30秒

时间:2017-05-03 15:50:48

标签: php

我有以下功能,使用cURL运行一系列URL:

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); 我的代码有什么问题吗?还有另一种调试方法吗?

1 个答案:

答案 0 :(得分:1)

这个替代功能为我解决了这个问题:

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; 

}