我们有RapidShare上托管的文件,我们希望通过自己的网站提供这些文件。基本上,当用户请求http://site.com/download.php?file=whatever.txt
时,脚本应该将文件从RapidShare流式传输给用户。
我唯一能解决的问题是如何正确地传播它。我想使用cURL,但我不确定我是否可以从块中读取RapidShare的下载,然后将它们回显给用户。到目前为止,我想到的最好的方法是使用fopen,fread的组合,将文件的块回显给用户,刷新并重复该过程,直到整个文件被传输。
我也知道PHP readfile()
函数,但这是最好的选择吗?请记住,这些文件的大小可以是几GB,虽然我们有16GB RAM的服务器,但我希望尽可能降低内存使用率。
感谢您的任何建议。
答案 0 :(得分:2)
HTTP有一个名为“Range”的Header,它基本上允许你获取文件的任何一块(知道你已经知道文件大小),但由于PHP不是多线程识别的,我没有看到任何使用它的好处。
Afaik,如果你不想消耗所有的RAM,唯一的方法是两步走。
首先,使用fopen()
/ fread()
(或允许您使用流的任何php函数)流式传输远程文件,将读取分成小块(2048位可能就足够了),写/将结果附加到tempfile()
,然后通过读取临时文件“回显”回用户。
这样,即使文件2To基本上也会消耗2048位,因为只有文件的块和句柄在内存中。
您也可以编写某种代理管理器来缓存并保留已经下载的文件,以避免在文件被大量下载时远程读取过程(并在给定时间内将其保存在本地)。