【发布时间】: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 更改默认内存设置——这就是它失败的原因。现在一切正常。