我不確定這是一個PHP問題,服務器配置問題還是硬件問題,但是我認爲我會從PHP開始,看看我是否有任何建議。這段代碼直到最近才正常工作,而且我不知道可能導致此問題的任何配置更改。我們最近從Debian Lenny升級到了Squeeze(並且從PHP 5.2升級到5.3),但代碼在另一個Squeeze服務器上正常工作。下載超過63MB的文件時出現500錯誤
我有一些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不應受內存限制的影響,並且我已檢查輸出緩衝已關閉,爲什麼大文件導致此(新)問題?
輸出緩衝關閉了嗎? (這是唯一可能的內存問題readfile()提到的手冊頁) –
那麼它是什麼? 500或505錯誤? (505沒有什麼意義。) – Ryan
PHPs'memory_limit'可能。它是什麼? – mario