2011-06-16 159 views
1

我使用这个下面多请求的功能,有时会出现问题,,在PHP - 卷曲多请求超时

do { 
curl_multi_exec($mh, $running); 
} while ($running > 0);

循环似乎无穷无尽,达到我的PHP执行限制。 我认为它与DNS查找有关,所以我现在直接调用IP地址。

但是,这个问题可悲的仍然有时发生......有没有办法为每个句柄设置一个超时以避免无限循环?我还能做些什么来解决这个问题?

非常感谢!

 
function multiRequest($data, $options = array()) 
    { 
     // array of curl handles 
     $curly = array(); 
     // data to be returned 
     $result = array(); 
     // multi handle 
     $mh = curl_multi_init(); 
     // loop through $data and create curl handles 
     // then add them to the multi-handle 
     foreach ($data as $id => $d) { 
      $curly[$id] = curl_init(); 
      $url = (is_array($d) && !empty($d['url'])) ? $d['url'] : $d; 
      curl_setopt($curly[$id], CURLOPT_URL, $url); 
      curl_setopt($curly[$id], CURLOPT_HEADER, 0); 
      curl_setopt($curly[$id], CURLOPT_RETURNTRANSFER, 1); 
      // post? 
      if (is_array($d)) { 
       if (!empty($d['post'])) { 
        curl_setopt($curly[$id], CURLOPT_POST, 1); 
        curl_setopt($curly[$id], CURLOPT_POSTFIELDS, $d['post']); 
       } 
      } 
      // extra options? 
      if (!empty($options[$id])) { 
       curl_setopt_array($curly[$id], $options[$id]); 
      } 

      curl_multi_add_handle($mh, $curly[$id]); 
     } 
     // execute the handles 
     $running = null; 
     do { 
      curl_multi_exec($mh, $running); 
     } while ($running > 0); 
     // get content and remove handles 
     foreach($curly as $id => $c) { 
      $result[$id] = curl_multi_getcontent($c); 
      curl_multi_remove_handle($mh, $c); 
     } 
     // all done 
     curl_multi_close($mh); 
     return $result; 
    } 
+0

谢谢,我不得不更新我的libcurl版本以使其工作:-)。 – heuri 2011-06-17 14:37:43

回答

1
  1. 您可以设置与CURLOPT_TIMEOUT(和其他选项)手柄的个人超时,尽管这需要你有一个相当新的libcurl它才能正常工作。

  2. 您可以拥有自己的超时时间,并且在任何给定的时间只需从多个句柄中删除句柄(从而取消操作)就足够了。