我不确定这是 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 不应受到内存限制的影响,并且我检查了输出缓冲已关闭,为什么大文件会导致这个(新)问题?