从远程服务器提供大型文件下载

时间:2012-06-13 01:37:33

标签: php stream download readfile

我们有RapidShare上托管的文件,我们希望通过自己的网站提供这些文件。基本上,当用户请求http://site.com/download.php?file=whatever.txt时,脚本应该将文件从RapidShare流式传输给用户。

我唯一能解决的问题是如何正确地传播它。我想使用cURL,但我不确定我是否可以从块中读取RapidShare的下载,然后将它们回显给用户。到目前为止,我想到的最好的方法是使用fopen,fread的组合,将文件的块回显给用户,刷新并重复该过程,直到整个文件被传输。

我也知道PHP readfile()函数,但这是最好的选择吗?请记住,这些文件的大小可以是几GB,虽然我们有16GB RAM的服务器,但我希望尽可能降低内存使用率。

感谢您的任何建议。

1 个答案:

答案 0 :(得分:2)

HTTP有一个名为“Range”的Header,它基本上允许你获取文件的任何一块(知道你已经知道文件大小),但由于PHP不是多线程识别的,我没有看到任何使用它的好处。

Afaik,如果你不想消耗所有的RAM,唯一的方法是两步走。

首先,使用fopen() / fread()(或允许您使用流的任何php函数)流式传输远程文件,将读取分成小块(2048位可能就足够了),写/将结果附加到tempfile(),然后通过读取临时文件“回显”回用户。

这样,即使文件2To基本上也会消耗2048位,因为只有文件的块和句柄在内存中。

您也可以编写某种代理管理器来缓存并保留已经下载的文件,以避免在文件被大量下载时远程读取过程(并在给定时间内将其保存在本地)。