问题描述
我需要获取一个远程文件并将其提供给用户而不将其保存到我的服务器磁盘中(用于隐藏原始URL),并且发现了很多有关下载具有各种功能的外部文件的帖子,这些文件具有各种功能,例如file_get_contents或readfile。我已经在使用这个了:
function startDownload($url){
if($this->url_exists($url))
{
//get filename from url
$name=$this->getFileName($url);
//first flush clear almost output
ob_end_flush();
//final clear
ob_clean();
//set headers
header('Content-Type: application/octet-stream');
header("Content-Transfer-Encoding: Binary");
header("Content-disposition: attachment; filename=\"" . $name . "\"");
//send file to client;
readfile($url);
//exit command is important
exit;
}
else JFactory::getApplication()->enqueueMessage(JText::_('URL_NOT_FOUND'),'error');
}
那行得通,但是有问题!对于大小为200 MB的文件,大约需要10秒钟才能开始在客户端浏览器中下载文件。我认为这是因为readfile首先将整个文件下载到我的服务器缓冲区中,然后再将其提供给用户。是吗?
是否可以使其更快?例如下载是在提取结束之前开始还是从技术上来说是不可能的?
实际上我不知道此方法是否经过优化。任何技术建议将不胜感激。
注意:
- 我知道应该为大文件更改此功能,现在我不必担心。
- 我考虑在同一数据中心购买外部服务器,以加快下载速度。
- 目标是将[文件服务器]与文件[在线商店]分开。
解决方法
我测试了@LawrenceCherone提到的curl方法。效果很好,但是将其移到我的项目中后,结果与readfile相同(白屏几秒钟)。
因此怀疑要使用readfile()函数。将我之前的代码分离到一个PHP文件中,结果令人赞叹!下载立即开始。
所以我认为我的猜测不正确,问题与readfile函数无关。
稍作搜索后,发现有较小的修改。 我在行下方添加了:
while (ob_get_level()) ob_end_clean();
:之前:
readfile($url);
现在下载开始,然后将整个文件提取到我的服务器中。