【问题标题】:PHP curl download remote stream / chunked dataPHP curl 下载远程流/分块数据
【发布时间】:2021-04-08 10:18:19
【问题描述】:

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

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

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

在 linux 的 cli 上使用wget,这很简单:

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

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

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

【问题讨论】:

  • 首先,您是否控制服务器,如果是,您能否有条件地禁用分块?如果是这样,我会这样做并让 PHP 设置一些东西,比如你要注意的特殊标头。否则,您是否尝试过:stackoverflow.com/a/18081658/231316
  • 所以,服务器正在发送打算在播放器中使用的小块,对吧?在这种情况下,您需要为每个块创建一个请求并手动将它们合并在一起。这种“分块方法”在流媒体服务中很常见,以节省带宽并跟踪观看的视频部分。
  • 感谢您的回复。原来是源服务器上的 PHP 内存限制。我刚刚配置了这台新机器,我忘了从 128M 更改默认内存设置——这就是它失败的原因。现在一切正常。

标签: php curl


【解决方案1】:

就我而言,它失败了,因为我忘记在源服务器上增加默认 PHP memory_limit

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-26
    相关资源
    最近更新 更多