下载超过63MB的文件时出现500错误

时间:2012-06-05 18:51:48

标签: php apache

我不确定这是PHP问题,服务器配置问题还是硬件问题,但我想我会从PHP开始,看看我是否有任何建议。这段代码直到最近一直运行正常,我不知道可能导致这种情况的任何配置更改。我们最近从Debian Lenny升级到Squeeze(从PHP 5.2到5.3),但代码在另一个Squeeze服务器上工作正常。

我有一些PHP代码,它采用传递为GET变量的文件的路径(通过mod_rewrite从请求重写到http://site.com/request/for/file.pdfhttp://site.com/downloader.php?path=/path/to/file.pdf)。这样做的原因与统计数据跟踪有关。

文件传递给此位代码(为便于阅读而简化)。

 if(is_readable($theFile)) {

       //$fh= fopen($theFile, "r");
       header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0");
       header("Pragma: no-cache");
       header("Content-Type: application/pdf");
       header("Content-Disposition: attachment; filename=\"".basename($theFile)."\"");
       header("Content-Length:".(string)(filesize($theFile)));
       sleep(1);
       //fpassthru($fh);
       readfile($theFile);
 }

如您所见,代码仅在文件可读时才会执行(即路径全部正确)。对于大约63MB以下的文件,一切正常。对于超过63MB的任何内容,服务器返回500错误。 (这在Firefox / Chrome中报告为'找不到文件',当我猜它应该是'内部服务器错误'时,但这是我想的另一个故事)。 Apache错误日志中没有任何内容。

任何人都可以想到会导致这种情况发生的任何PHP或Apache服务器配置吗?据我所知,PHP内存限制不应受readfile或fpassthru的影响。我注意到我的PHP内存限制是64MB,但是,关闭mod_rewrite重定向到PHP并不能解决问题。文件仍然无法下载。

非常感谢任何建议。

修订*的 * ** * ** * ** *

好的,所以我将PHP内存限制从64MB增加到200MB。这允许下载高达200MB的文件。但问题仍然存在。鉴于readfile和fpassthru不应受内存限制的影响,并且我已检查输出缓冲是否已关闭,为什么大文件会导致此(新)问题?

1 个答案:

答案 0 :(得分:1)

决议很简单(工作时间后)。

php_value output_buffering 0

添加到Apache虚拟主机配置。

似乎无论ob_get_level()表示什么,输出缓冲都在发生。换句话说,只有使用输出缓冲的选项足以影响PHP内存的使用。