1

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

4

1 回答 1

1

解决方案很简单(下班后)。

php_value output_buffering 0

添加到 Apache 虚拟主机配置。

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

于 2012-06-05T20:50:23.673 回答