2011-03-28 106 views
3

我花了數小時搜索,以及搜索Apache網站,我找不到任何有關Apache如何處理文件上傳的文檔 - 特別是大文件。我讀過anecdotalreports,直到上傳完成後纔會涉及PHP,這正是我所期望的。但就Apache上傳的過程而言,我找不到任何東西。關於Apache如何處理文件上傳的任何文檔?

的原因,我對熱點文檔Apache正在上傳存儲完全在內存中,而不是將它們流盤。 httpd將在我使用的服務器上使用可用內存的每個字節,直到它崩潰。通常,消耗的物理內存量是上傳文件大小的3倍,並且在5 MB/s附近增加(遠不及我的上傳速度)。

我測試了我在使用其他LAMP堆棧此相同的請求,和Apache內存使用並不整個上傳過程中發生任何變化。

任何人都可以向我解釋的Apache可能是如何處理相同的上傳如此不同的兩個不同的服務器?任何想法不勝感激。

+0

你的文件上傳專門搜索?也許你應該查看一下Apache如何處理傳入的POST請求。 – Raffael 2011-03-28 19:34:37

+0

你看過嗎? http://stackoverflow.com/questions/5077252/php-file-upload-memory-handling-on-cgi – 2011-03-28 19:37:13

+0

@ james-black不,我沒有看到...非常有幫助。 – JKS 2011-03-28 19:59:29

回答

2

答案是不令人滿意的。我從來沒有找到任何文件。

我繼續在黑暗中閒逛,終於跌跌撞撞在mod_fcgid升級(從2.2到2.3.6),該訣竅。也許在2.2中有一個bug。

內存使用量仍然在2.3.6中上升,但遠不及那麼顯着。對於〜100 MB文件,只有幾兆字節。 (然而,當上傳完成後,文件被移動時,內存使用量瞬間拍攝最多〜100-200 MB,但後來似乎被立即釋放。)

3

從技術上講,PHP 處理代表的Apache的上傳,並在RAM中緩存文件,直到它完成。但是,只有在上傳完成(或中止)之後,腳本才能獲得控制權。除非必須,否則Apache本身不會緩衝到磁盤。把它看作是一個隱形的「handle_upload()」函數調用,它被透明地插入到腳本中的第一件事中。

回到「一切都是cgi腳本」的日子裏,像php這樣的語言解釋器沒有嵌入到web服務器進程中,POST數據通過標準輸入發送到CGI腳本文件將通過Apache直接傳遞到CGI因爲它來的過程,並且可以閱讀逐字節。

相關問題