如何设置php curl下载的最大大小限制

时间:2013-07-14 16:02:38

标签: php curl

php curl下载是否有最大大小限制。即当转移达到某个文件限制时会卷曲退出吗?

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$data = curl_exec($ch);

用于下载远程图像的网站。想要确保卷曲在达到一定限度时停止。 我的研究也显示 getimagesize()下载图片,以返回其大小。所以它不是一个选择。

3 个答案:

答案 0 :(得分:24)

我有另一个答案可以解决这个问题,最好留给后人留下来。

CURLOPT_WRITEFUNCTION对此有好处,但 CURLOPT_PROGRESSFUNCTION是最好的

// We need progress updates to break the connection mid-way
curl_setopt($cURL_Handle, CURLOPT_BUFFERSIZE, 128); // more progress info
curl_setopt($cURL_Handle, CURLOPT_NOPROGRESS, false);
curl_setopt($cURL_Handle, CURLOPT_PROGRESSFUNCTION, function(
    $DownloadSize, $Downloaded, $UploadSize, $Uploaded
){
    // If $Downloaded exceeds 1KB, returning non-0 breaks the connection!
    return ($Downloaded > (1 * 1024)) ? 1 : 0;
});

请注意,即使CURLOPT_PROGRESSFUNCTION {{1}}:

  

接受五个参数的回调。

我的本​​地测试仅包含四(4)个参数,因为 1st(句柄)不存在。

答案 1 :(得分:4)

有。我认为这是PHP内存限制。下载是在内存中完成的......

CURLOPT_FILE and CURLOPT_WRITEHEADER^是您的朋友,因为他们允许您将cURL下载重新路由到流。这允许您创建tmpfile()临时流stream_get_meta_data()为您提供文件路径)并下载到它们。直接下载到驱动器会解除内存限制。

下载完成后,您可以阅读这些文件并按照自己的意愿行事。

答案 2 :(得分:3)

服务器不支持Range标头。您可以做的最好是在收到的数据超过您想要的时间后立即取消连接。例如:

<?php
$curl_url = 'http://steamcommunity.com/id/edgen?xml=1';
$curl_handle = curl_init($curl_url);

$data_string = "";
function write_function($handle, $data) {
global $data_string;
$data_string .= $data;
if (strlen($data_string) > 1000) {
    return 0;
}
else
    return strlen($data);
} 

curl_setopt ($curl_handle, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($curl_handle, CURLOPT_CONNECTTIMEOUT, 2);
curl_setopt ($curl_handle, CURLOPT_WRITEFUNCTION, 'write_function');

curl_exec($curl_handle);

echo $data_string;

也许更干净,你可以使用http包装器(如果使用--with-curlwrappers编译它也会使用curl)。基本上你会在一个循环中调用fread,然后当你获得的数据超过你想要的数据时就关闭流。如果禁用allow_url_fopen,您还可以使用传输流(使用fsockopen打开流,而不是fopen并手动发送标头)。