2012-06-05 77 views
1

我不確定這是一個PHP問題,服務器配置問題還是硬件問題,但是我認爲我會從PHP開始,看看我是否有任何建議。這段代碼直到最近才正常工作,而且我不知道可能導致此問題的任何配置更改。我們最近從Debian Lenny升級到了Squeeze(並且從PHP 5.2升級到5.3),但代碼在另一個Squeeze服務器上正常工作。下載超過63MB的文件時出現500錯誤

我有一些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

輸出緩衝關閉了嗎? (這是唯一可能的內存問題readfile()提到的手冊頁) –

+0

那麼它是什麼? 500或505錯誤? (505沒有什麼意義。) – Ryan

+2

PHPs'memory_limit'可能。它是什麼? – mario

回答

1

分辨率很簡單(工作幾小時後)。

php_value output_buffering 0 

添加到Apache虛擬主機配置。

似乎不管什麼ob_get_level()說,輸出緩衝正在發生。換句話說,使用輸出緩衝的選項足以影響PHP內存的使用。

相關問題