Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php curl_multi_getcontent从1000+;网址_Php_Multithreading_Curl - Fatal编程技术网

Php curl_multi_getcontent从1000+;网址

Php curl_multi_getcontent从1000+;网址,php,multithreading,curl,Php,Multithreading,Curl,我在使用multicurl从数据库生成的多个url检索json数据时遇到问题,如果我将查询限制在100到500个链接,则问题不会发生,但当链接达到1000+时,我开始从curl\u multi\u getcontent获得随机空返回 多重旋度函数: function curlMultiExec($nodes) { $node_count = count($nodes); $ch_arr = array(); $master = curl_multi_init()

我在使用multi
curl
从数据库生成的多个url检索json数据时遇到问题,如果我将查询限制在100到500个链接,则问题不会发生,但当链接达到1000+时,我开始从
curl\u multi\u getcontent
获得随机空返回

多重旋度函数:

function curlMultiExec($nodes)
{     
  $node_count = count($nodes);     
  $ch_arr = array();

  $master = curl_multi_init();

  for($i = 0; $i < $node_count; $i++)
  {
      $url        = $nodes[$i]['url'];
      $ch_arr[$i] = curl_init($url);

      curl_setopt($ch_arr[$i], CURLOPT_RETURNTRANSFER, TRUE);  
      curl_setopt($ch_arr[$i], CURLOPT_BINARYTRANSFER, TRUE);
      curl_setopt($ch_arr[$i], CURLOPT_FOLLOWLOCATION, TRUE);  
      curl_setopt($ch_arr[$i], CURLOPT_AUTOREFERER,    TRUE); 
      curl_setopt($ch_arr[$i], CURLOPT_HEADER,         FALSE);
      curl_multi_add_handle($master, $ch_arr[$i]);
  }

  $running = null;
  do 
  {
    curl_multi_exec($master,$running);
  } while( $running > 0 );


  $obj = array();
  for($i = 0; $i < $node_count; $i++ )
  {
       $item = array(              
           'url'        => $nodes[$i]['url'],
           'content'    => curl_multi_getcontent($ch_arr[$i])              
        ); 
        array_push($obj, $item);       
}        
curl_multi_close($master);  
return $obj;
}
请告诉我为什么它会返回随机空值,或者是什么导致了这种行为,或者有比这更好的方法吗


更新(2014-02-20); 我在这里找到了解决方案:

问题在于,curl_multi的大多数实现都会等待每组请求完成,然后再处理它们。如果一次处理的请求太多,它们通常会被分成若干组,然后一次处理一个请求

解决方案是在每个请求完成后立即进行处理。这消除了繁忙等待造成的CPU周期浪费

基于他的方法,我成功地解决了这个问题。也许这篇文章能有所帮助,以防有人遇到同样的问题


干杯

1000个同时连接将很容易使您达到最大打开文件/套接字数的通用限制:1024。可能是你在这里撞到的东西


关于如何更改限制的相关问题:

那么分批执行……也许API方面有限制,如果问题是这样的话,你可以在500个请求后添加睡眠,或者类似的东西。我读了一篇博客,上面写道:“问题是大多数curl\u multi的实现都会等待每一组请求完成后再处理它们。”。如果一次处理的请求太多,它们通常会被分成若干组,然后一次处理一个请求。“curl_multi真的是这样吗?”?
Array
    (
       [0] => Array
       (
        [url] => http://api.worldbank.org/countries/AFG/indicators/NY.GDP.MKTP.CD?per_page=100&date=1960:2014&format=json
        [content] => [{ /* json data */ }]
    )

[1] => Array
  (
        [url] => http://api.worldbank.org/countries/ALB/indicators/NY.GDP.MKTP.CD?per_page=100&date=1960:2014&format=json
        [content] =>   // -> here's the sample null value
  )

  .
  .  //-> and some random [content] here also contains null value 
  .
  .
  [1191] => Array
  (
        [url] => http://api.worldbank.org/countries/ZWE/indicators/NY.GDP.MKTP.CD?per_page=100&date=1960:2014&format=json
        [content] => [{ /* json data */ }]
  )
)