17

PHP cURL 下载是否有最大大小限制?IE。当传输达到某个文件限制时,cURL 会退出吗?

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

它适用于下载远程图像的站点。我想确保 cURL 在达到一定限制时停止。

我的研究还显示getimagesize()下载图像,以返回其大小,因此它不是一个选项。

4

3 回答 3

30

我有另一个答案可以更好地解决这种情况,以便为后代留下。

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;
});

请记住,即使PHP.net 声明^CURLOPT_PROGRESSFUNCTION

接受五个参数的回调。

我的本地测试只有四 (4) 个参数,因为第一个(句柄)不存在。

于 2013-07-14T19:01:39.230 回答
5

服务器不遵守 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 ,然后当你得到比你想要的更多的数据时在流上 fclose 。如果 allow_url_fopen 被禁用,您还可以使用传输流(使用 fsockopen 打开流,而不是 fopen 并手动发送标头)。

于 2013-07-14T16:15:04.957 回答
4

有。我想这是 PHP 内存限制。由于下载是在内存中完成的...

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

下载完成后,您可以阅读这些文件并按照您的意愿使用它们。

于 2013-07-14T16:16:19.500 回答