卷曲下载2.5k +文件太慢了

时间:2010-10-03 00:25:13

标签: php curl

我必须使用curl下载2.5k +文件。我正在使用Drupals内置的批处理api来启动curl脚本而不会超时但是它需要花费10多分钟才能获取并保存文件。

使用实际文件的处理添加此项。此脚本的潜在运行时间约为30分钟。服务器性能不是问题,因为dev / staging和live服务器都足够强大。

我正在寻找有关如何提高速度的建议。整体执行时间并不算太大,因为这意味着要运行一次,但了解替代方案会很好。

2 个答案:

答案 0 :(得分:2)

让我们假设问题是端到端延迟,而不是带宽或CPU。在这种情况下,延迟是围绕使系统调用卷曲,建立HTTP连接,请求文件和拆除连接。

一种方法是将请求分开并并行运行。你提到Drupal所以我假设你在这里谈论PHP。我们还假设2.5k文件以URL形式列在数组中。你可以这样做:

<?php
$urls = array(...);
$workers = 4;
$shard_size = count($urls) / $workers;
for ($i = 0; $i < $shard_size; $i++) {
  for ($j = 0; $j < $workers - 1; $j++) {
    system("curl " . $urls[$i * $shard_size + $j] . "&");
  }
  system("curl " . $urls[$i * $shard_size + $j]);
}
?>

这很蹩脚,但你明白了。它会分离$ worker-1子进程以在后台获取文件,并在前台运行最后一个worker以便获得一些调步。它应该与工人数量大致呈线性关系。它没有考虑数据集大小不均匀分配给工人#的边缘情况。我敢打赌,你可以采取这种方法,并做出相当快的事情。

Curl还支持在同一命令行上请求多个文件,但我不知道它是否足够智能以重用现有的HTTP连接。可能是。

答案 1 :(得分:0)

在玩了几种不同的方法后,我得出结论,你只需咬紧牙关就可以了。

脚本需要一段时间才能处理,但它有大量的数据需要处理。