【问题标题】:cURL takes long time to start downloadcURL 需要很长时间才能开始下载
【发布时间】:2015-05-31 18:09:12
【问题描述】:

我正在尝试通过服务器 B 在服务器 C 上下载一个文件 (1GB),该文件具有以下代码:

header("Content-Disposition: attachment; filename=How to Use Git and GitHub Videos.zip");
header("Content-type: application/octet-stream");
header("Content-Transfer-Encoding: binary");

$url = "http://zips.udacity-data.com/ud775/How%20to%20Use%20Git%20and%20GitHub%20Videos.zip";

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_BUFFERSIZE, 256);

curl_exec ($ch);
curl_close($ch);

我期待它会立即开始 dwonlaoding 文件。但相反,我必须等待很长时间,直到我的浏览器窗口会询问在哪里保存它。我以为curl_setopt($ch, CURLOPT_BUFFERSIZE, 256); 意味着它将逐块传输文件,所以我不必等待它会先读取所有文件。

那么为什么开始下载需要这么长时间?我该如何解决?如果这个方法是错误的,请给我其他建议

【问题讨论】:

    标签: php curl download downloading-website-files


    【解决方案1】:

    那是因为 curl_exec() 会阻塞直到它读取完整响应(在您的情况下在进程中消耗 1GB 内存)。但是你可以让它调用你自己的函数:

    curl_setopt($ch, CURLOPT_WRITEFUNCTION, function($ch, $buffer) {
      echo $buffer;
      return strlen($buffer);
    });
    curl_exec ($ch); // curl will call CURLOPT_WRITEFUNCTION as it receives data inside curl_exec()
    

    确保根本没有设置CURLOPT_RETURNTRANSFER,既不设置为假,也不设置为真。

    【讨论】:

    • 谢谢您的回复先生,我花了5个小时试图解决这个任务,先生,请您在这里写下可行的解决方案。我不知道在哪里粘贴您的代码以及在哪里删除curl_exec()。请先生
    • Marek,感谢您的回复,但没有帮助。它仍然等待将所有文件读入内存。请看这个问题link
    猜你喜欢
    • 2018-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多