我试图通过服务器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);
意味着它将按块传输文件块,所以我不必等待它将首先读取所有文件。
那为什么开始下载需要这么长时间?我该如何解决?如果这种方法有误,请建议我别的什么
答案 0 :(得分: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
完全没有设置,也不设置为false,也不设置为true。