2012-06-13 33 views
6

我试过所有的标题。 有和没有内容长度。900 MB的http被迫下载很少完成

问题在于,dowload在中途徘徊。但只有大部分时间。

有时它工作得很好。

服务器资源的使用是微不足道的。 所有的配置文件都很好。我不会在运行时运行php脚本。

有没有人见过这个?这不是我的错吗?为什么有时?

$file = "http://domain.com/files/".$item_number.".mov"; 
header('Pragma: no-cache'); 
header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
header('Content-Description: File Download'); 
header('Content-Type: application/force-download'); 
//header ('Content-Type: video/quicktime');//doesnt seem to download at all here 
header('Content-Length: '.filesize($file)); 
header('Content-Disposition: attachment; filename="'.basename($file).'"'); 
header('Content-Transfer-Encoding: binary'); 
readfile($file); 
exit(); 

谢谢, 对不起,这是我第一次。

+4

下载是通过PHP脚本完成的吗?你能告诉我们代码吗? –

+3

仅仅因为他们被新手问过就停止提问。这是100%真实的问题。 –

+0

你看过你的日志文件吗? PS - 请输入密码。 – xbonez

回答

3

这可能有几个原因。

您的意思是服务器资源正常,但我认为在发送PHP之前将整个文件加载到内存中。幸运的是,在文档中有一个很好的solution,您应该使用它来防止遇到多次下载问题:)

另外,您是否将脚本执行时间设置为无限?

接下来将是您的服务器设置。也许他们为了超时/资源原因关闭了连接。

例如使用Google Chromes开发人员工具仔细检查您发送的标头。 PHP自己设置一些头文件。您应该在脚本的开头放置session_cache_limiter(false);。如果我没有记错,即使Expires: Thu, 19 Nov 1981 08:52:00 GMT ...为什么这是不好的?下一步;

您可以发送Etag和Last-Modified标头。我认为它是您的资源的唯一标识符,这使得恢复下载成为可能。我认为寻找关于此的好文章比在这里给你一些句子更好。在你的情况下,你可以使用PHP stat()函数来创建一个Etag。

有一些人用头和下载挣扎,你可以开始(或修复您的情况)here

摘要:

  • 检查你的PHP /服务器到期/限制/资源设置
  • 请务必发送缓冲文件
  • 使其可以恢复下载
  • 检查您要发送的标头

之后,你应该没问题。恢复即使它仍然应该...

良好的进展和成功!

+1

从手册中可以看出,即使发送大文件,readfile()也不会出现任何内存问题,如果遇到内存不足错误,请确保使用ob_get_level()关闭输出缓冲区。 – Matthew

+0

也许共享主机或其他东西 - 我只是总结了我所知道的所有可能的原因:) readfile()不会出现内存问题* IF * ...它绝对是列表中的一个。 –

+0

http://stackoverflow.com/questions/6627952/why-does-readfile-exhaust-php-memory服务器废话,多个用户,本质上是我说的 - 主要的东西仍然是消除像这样的资源猪 –

相关问题