2011-01-06 83 views
8

我試圖將大於2GB的文件上傳到本地PHP 5.3.4服務器。我設置了以下服務器變量:使用PHP上傳大於2GB的文件

memory_limit = -1 
post_max_size = 9G 
upload_max_filesize = 5G 

然而,在error_log中,我發現:

PHP的警告:POST的2120909412個字節的內容長度超過1073741824個字節的限制在未知線0

有誰能告訴我爲什麼這樣會一直不合格嗎?

+3

HTTP確實不是上傳2GB文件的正確協議選擇。你應該爲此使用(S)FTP。 – 2011-01-06 10:57:20

+3

您是否驗證過這些變量? (也就是通過'phpinfo()'),PHP永遠不會讓我驚訝於它實際上正在讀取哪個配置文件......(另外,HTTP並不適用於此...) – Thanatos 2011-01-06 10:58:00

+1

爲什麼你想使用PHP而不是像FTP或任何數字或其他上傳文件的方式 – Earlz 2011-01-06 10:58:25

回答

2

也許這可以在POST大小來自Apache的限制:

http://httpd.apache.org/docs/current/mod/core.html#limitrequestbody

似乎對2Gb的這種限制可以更大的64位安裝,也許。而且我不確定在這個directove中設置0沒有達到編譯限制。例如參見線程:

http://ubuntuforums.org/archive/index.php/t-1385890.html

然後別忘了改變,以及在PHP中max_input_time設置。

但是你已經達到了極限:-)也許你可以在瀏覽器端嘗試一個富客戶端(flash?js?),以大塊或某種FTP方式進行傳輸,併爲用戶提供進度指示器。

+0

我在64位操作系統上嘗試了相同的操作,並且沒有任何問題。謝謝你的幫助。 – Reado 2011-02-13 14:15:22

3

我不知道在5.3.x中,但在5.2.x中有一些int/long問題在PHP代碼中。即使您使用的是64位系統,並且使用64位編譯的PHP版本,也存在一些問題。

首先,將post_max_size和其他人從ascii轉換爲整數的代碼將值存儲在一個int中,因此它轉換「9G」並將結果放入此int將生成該值,因爲9G的數字大於32位變量可以保存。

但也有幾個PHP代碼的其他領域與Apache模塊,CGI等一起使用,需要從int更改爲long。

所以...爲了這個工作,你需要編輯PHP代碼並手動編譯它(確保你編譯爲64位)。這裏有一個鏈接,diff文件的列表:

http://www.archive.org/~tracey/downloads/patches/karmic-64bit-post-large-files.patch

從這個PHP錯誤後引用:http://bugs.php.net/bug.php?id=44522

上面的文件是5.2.10代碼差異,但我只是做手工的變化到5.2.17代碼,我剛剛通過apache/php上傳了一個3.4gb的單個文件(這在修改之前並沒有工作)。

ope有幫助。

3

我也有類似的問題,但我的配置是:

post_max_size = 1.8G 
upload_max_filesize = 1.8G 

,但我不能上傳文件1.2GB。錯誤是非常相同:

PHP Warning: POST Content-Length of 1347484420 bytes exceeds the limit of 1073741824 bytes in Unknown on line 0 

我花了一天想知道到底是該「的限1073741824」的到來!

解決方案

實際上,錯誤是在php.ini解析器:它只能理解整數,所以本質上它被解析爲1.8G1G

將值更改爲例如1800M修復了它。

PLS確保與以下命令服務的apache2重啓

+0

我已經花了數小時的時間試圖找出上傳大文件的安裝問題,這畢竟是個問題。 – Ark74 2015-12-22 05:17:57

1

如phliKtid提到重啓Apache服務器,這是與PHP框架的限制。保存以編輯鏈接中提到的bug report phliKtid中的源代碼,有一種解決方法,其中包括將php.ini文件中的upload_max_filesize設置爲0。

; Maximum allowed size for uploaded files. 
; http://php.net/upload-max-filesize 
upload_max_filesize = 0 

通過這樣做,PHP不會試圖「5G」轉換爲32位整數時崩潰,您將能夠爲您允許使用「的post_max_size」變量來上傳文件一樣大。

1

我弄清楚如何使用HTTP和PHP上傳10G文件。

的php.ini:

post_max_size = 0 
upload_max_filesize = 0 

它工作在PHP 5.3.10。

如果您沒有將該文件全部加載到內存中,memory_limit是無關的。