【问题标题】:Fastest way to download multiple urls下载多个网址的最快方法
【发布时间】:2014-01-06 21:00:21
【问题描述】:

我有一个门户网站,需要下载许多单独的 json 文件并以某种表单视图显示它们的内容。很多我的意思是至少 32 个单独的文件。

我已经尝试使用蛮力迭代的 cUrl,它需要大约 12.5 秒。

我已经尝试了 curl_multi_exec ,如http://www.php.net/manual/en/function.curl-multi-init.php 所示,使用下面的函数,它需要大约 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 并将代码移动到生产机器上看到了显着的改进

【问题讨论】:

  • 必须在后端完成吗?为什么不将获取移至客户端?一些 AJAX 魔术、主干视图和您的基本完成。在 waaaay 不到 9 秒。 ;-)
  • 是的...我想过这个问题,但我必须轻松地重构约 75% 的工作,而这在短期内是无法完成的。从长远来看,这绝对是我应该做的。
  • 缓存是一个选项吗?或显式或隐式。 (这在很大程度上与将 fetch 移动到客户端是正交的。)
  • 如果您从 12.5 秒变为 9 秒,那么这是否意味着您最长的 cURL 请求是 9 秒,而其他 31 个小于 9 秒?使用curl_multi_init()时有cURL限制吗?
  • @user2191572 does that mean your longest cURL request is 9 seconds 是的,这很有可能

标签: php performance


【解决方案1】:

您绝对应该考虑对您的 cURL 进行基准测试,以查看哪个 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>';

【讨论】:

  • 我会试一试
  • 最慢的是~600ms。最快的是 200。平均是 250 毫秒
  • 那么每次完成 32 次迭代大约需要 8 秒?
  • 实际上是 9.22 秒......但是是的。
  • 加起来应该需要大约 600 毫秒。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-03
  • 2012-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多