下载多个网址的最快方式

时间:2014-01-06 21:00:21

标签: php performance

我有一个门户网站,需要下载许多单独的json文件,并在一种表单视图中显示它们的内容。按批次我的意思是最少32个单独的文件。

我已经尝试过使用强力迭代的cUrl并且需要大约12.5秒。

我已尝试使用下面的函数http://www.php.net/manual/en/function.curl-multi-init.php演示curl_multi_exec,并且花费约9秒。好一点,但仍然非常慢。

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_multi_add_handle($mh, $curl_array[$i]);
    }
    $running = NULL;
    do {
        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;
}

我意识到这是一项固有的昂贵操作,但有没有人知道其他可能更快的替代方案?

编辑:最后,我的系统限制了curl_multi_exec并将代码移到生产机器上看到了显着的改进

1 个答案:

答案 0 :(得分:2)

你一定要考虑对你的cURL进行基准测试,看看哪一个有减速但这对于评论来说太冗长了,所以让我知道它是否有帮助:

// revert to "cURLing with brute force iteration" as you described it :)

$curl_timer = array();

foreach($curlsite as $row)
{
    $start = microtime(true);

    /**
     * curl code
     */

    $curl_timer[] = (microtime(true)-$start);
}

echo '<pre>'.print_r($curl_timer, true).'</pre>';