2011-07-21 25 views
5

我正在爲我的公司開發文件上傳服務。我們的用戶經常向我們發送非常大的.zip文件,其中包含非常大的illustrator文件。通常這些文件不會超過1.5GB,但我需要計劃處理高達4GB的文件。爲大型上傳配置Apache

顯然,這導致了很多關於如何配置我的Apache以允許如此大的文件傳輸而不會超載我的服務器或打開安全漏洞的擔憂。

關注1:內存限制我的系統

的一個特點是,用戶應該能夠下載他們的文件回他們上傳後他們。我避免使用標準下載(只是鏈接到文件),因爲安全問題 - 我不能讓其他用戶下載其他文件。我的解決方案是將上傳的文件保存在www-root之外的受保護的目錄中,並通過PHP腳本加載它們。這PHP腳本看起來有點像這樣:

$fo = fopen($uploadDir.$file_name, "r"); 
while(!feof($fo)) { 
     $strang = fread($fo, 102400); 
     echo $strang; 
     ob_flush(); 
} 
fclose($fo); 

我已經把FREAD進入一個循環,並鎖定成一次只加載文件的小塊。我這樣做是因爲我的服務器只有4GB的RAM,並且需要能夠處理多人同時下載(可能最多20人)。我的第一個問題是,我應該一次讀多大塊。由於該塊大小,現在下載一個1.5GB的文件非常緩慢。

關注2:最大執行時間

上傳的另一個問題/下載這麼大的文件是最大的執行時間。儘管我的內部網絡上的所有內容都非常快,但我應該爲連接速度慢的用戶做好準備。我將低端上傳速率設置爲1Mbps,上傳時間大約爲35分鐘。讓我們慷慨地說,他們可以以這種速度的兩倍下載,所以需要15分鐘才能下載。

將max_excution_time設置爲30分鐘會帶來安全風險嗎?它會殺死我的服務器上的任何東西嗎?我沒有任何理由認爲這是一個壞主意,但我的直言只是尖叫,我會愚蠢地允許腳本運行那麼久。有沒有更好的方式來做我想做的事情?


我見過其他類似的問題,其中大多數人建議使用類似java或silverlight的東西。我想,如果有任何明智的方式,以避免Java。我目前使用swfupload和附帶的jQuery插件。

+2

對於文件下載速度問題,也許我的老答案可以幫助:http://stackoverflow.com/questions/3697748/fastest-way-to-serve-a-file-using-php/3731639#3731639 –

+0

愛那種方法。如果我將我的文件保存在受保護的目錄中,它工作嗎?或者他們需要在Web服務器上可用?我已經安裝了它,但它不工作..並沒有真正給出任何錯誤信息。 – jwegner

+1

使用「X-SendFile」?該文件只需要運行Web服務器進程的用戶可讀。 –

回答

1

關注1:內存限制

readfile流,所以這被轉換成在運行中的HTTP響應,它不會被加載到存儲器完成。

對於上載但是,因爲上載和使用PHP整個文件進入內存,如果我沒記錯的腳本必須有足夠的內存。

關注2:最大執行時間

如果你擔心安全問題,處理身份驗證和訪問權限已經通過在httpd服務器。然後,當請求無效時,腳本將不會執行。