使用cURL限制下载带宽

时间:2010-06-18 01:46:35

标签: php curl download

我一直试图用PHP限制带宽。我无法通过PHP限制下载速率。

你能帮忙吗?

function total_filesize($url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "$url");
    curl_setopt($ch, CURLINFO_SPEED_DOWNLOAD,12); //ITS NOT WORKING! 
    curl_setopt($ch, CURLOPT_USERAGENT,
            "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.11) ".
            "Gecko/20071127 Firefox/2.0.0.11");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_NOBODY, true);


    $chStore = curl_exec($ch);
    $chError = curl_error($ch);
    $chInfo = curl_getinfo($ch);
    curl_close($ch);
    return $size = $chInfo['download_content_length'];
}

function __define_url($url) {
    $basename = basename($url);
    Define('filename',$basename);
    $define_file_size = total_filesize($url);
    Define('filesizes',$define_file_size);
}

function _download_file($url_file) { 
    __define_url($url_file);

    // $range = "50000-60000";
    $filesize = filesizes;
    $file = filename; 
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename="'.$file.'"'); 
    header('Content-Transfer-Encoding: binary');
    header("Content-Length: $filesize");
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,"$url_file");
    curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
    //  curl_setopt($ch, CURLOPT_RANGE,$range);

    curl_exec($ch);
    curl_close($ch);
}
_download_file('http://rarlabs.com/rar/wrar393.exe'); 

3 个答案:

答案 0 :(得分:15)

CURLOPT_MAX_RECV_SPEED_LARGE是您想要的选项。

在卷曲7.15.5中添加。自 PHP 5.4.0

以来,以PHP / CURL形式呈现

答案 1 :(得分:0)

我会通过服务器限制带宽,例如IIS或Apache。

答案 2 :(得分:0)

CURLINFO_SPEED_DOWNLOAD 告知您下载速度;它不是你可以设置的选项。也就是说,如果它是一个选项,你将把它设置在错误的位置(在你发出HEAD请求获取文件大小的部分, - 顺便说一下,这是不必要的,但这在这里是无关紧要的 - 并且不是你实际下载文件的地方)。

您可以使用PHP流来执行此操作,您可以在其中循环并检索/发送更多数据或根据您的限制等待,但我认为没有办法为PHP流交换curl资源。您唯一的选择可能是使用http wrapper代替。

您也可以尝试CURLOPT_FILE并将文件保存到“php:// temp”流,然后从中读取,但我不确定它是否可行。