我不确定这是PHP问题,服务器配置问题还是硬件问题,但我想我会从PHP开始,看看我是否有任何建议。这段代码直到最近一直运行正常,我不知道可能导致这种情况的任何配置更改。我们最近从Debian Lenny升级到Squeeze(从PHP 5.2到5.3),但代码在另一个Squeeze服务器上工作正常。
我有一些PHP代码,它采用传递为GET变量的文件的路径(通过mod_rewrite从请求重写到http://site.com/request/for/file.pdf到http://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不应受内存限制的影响,并且我已检查输出缓冲是否已关闭,为什么大文件会导致此(新)问题?
答案 0 :(得分:1)
决议很简单(工作时间后)。
php_value output_buffering 0
添加到Apache虚拟主机配置。
似乎无论ob_get_level()表示什么,输出缓冲都在发生。换句话说,只有使用输出缓冲的选项足以影响PHP内存的使用。