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