首页 > 解决方案 > PHP curl 下载远程流/分块数据

问题描述

我在远程服务器上有流式传输/分块给用户的音频文件。这一切都在客户端浏览器中运行良好。

但是当我尝试使用 curl 从另一台服务器本地下载和保存文件时,它似乎只能成功下载小文件(小于 10mb),任何更大的文件,而且似乎只能下载标题。

我认为这是因为分块,所以我的问题是如何让 curl 下载更大的(分块)文件?

wgetlinux上的cli上,这很简单:

wget -cO - https://example.com/track?id=460 > mytrack.mp3

这是我使用 curl in 编写的函数PHP,但就像我说的那样,它只下载大文件的标题:

private function downloadAudio($url, $fn){
    $ch = curl_init($url);
    $path = TEMP_DIR . $fn;
    $fp = fopen($path, 'wb');
    curl_setopt($ch, CURLOPT_FILE, $fp);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_exec($ch);
    curl_close($ch);
    fclose($fp);

    if (file_exists($path)) {
        return true;
    }
    return false;
 }

标签: phpcurl

解决方案


就我而言,它失败了,因为我忘记增加memory_limit原始服务器上的默认 PHP。

在发布这个问题后发现,它实际上成功下载了任何似乎低于 100mb 标记的文件,而不是我在问题中所说的 10mb。当我意识到这一点时,我检查了memory_limit和低,发现它被设置为默认的 128m。

我没有注意到客户端有任何问题,因为它被分块了,但是当服务器试图在不到 1 秒的时间内抓取整个 300mb 文件时,必须达到内存限制。


推荐阅读