Php curl_multi_getcontent从1000+;网址
我在使用multiPhp 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()
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 */ }]
)
)