昨天一做php開發的網友問我為什麼上傳大檔案總是失敗,但是上傳小檔案就沒有問題。作者一時半會兒也不知道什麼原因,遂網上搜搜幫其分析原因,看到一篇很不錯的關於php上傳大檔案失敗的各種原因的總結以及各種解決辦法的,於是轉來與大家分享之。
下面分別是各種原因以及解決辦法
(1)檔案上傳時存放檔案的臨時目錄必須是開啟的並且是 PHP 進程所有者使用者可寫的目錄。如果未指定則 PHP 使用系統預設值。
php.ini檔案中upload_tmp_dir用來說明PHP上傳的檔案放置的臨時目錄,要想上傳檔案,得保證伺服器沒有關閉臨時檔案並對該檔案夾有寫入的許可權。
(2)max_execution_time 的值必須足夠大。變數 max_execution_time 設定了在強制終止指令碼前PHP等待指令碼執行完畢的時間,此時間以秒計算。當指令碼進入了一個無限迴圈狀態時此變數非常有用。然而,當存在一個需要很長時間完成的合法活動時(例如上傳大型檔案),這項功能也會導致操作失敗。在這樣的情況下必須考慮將此變數值增大,以避免PHP在指令碼正在執行某些重要過程的時候將指令碼關閉,例如設定為 90 秒。
max_execution_time = 90
注意在php函數中還有個 set_time_limit 函數,和以上這個設定的作用是相同的,這兩者的區別就是 以上是在 php.ini 檔案中設定的,而 set_time_limit 是寫在php檔案中的。所以也可以通過在頁面中用 set_time_limit 設定程式的最長執行時間,比如無限制即:set_time_limit(0);
(3)file_uploads = On 預設值為on,意思是允許通過 HTTP 進行檔案上傳,此選項不能設定為OFF。
(4)upload_max_filesize = 2M 設定檔案上傳的大小的最大值,php.ini設定檔中的預設檔案上傳大小為2M,php初學者容易犯的一個錯誤是在編寫檔案上傳功能時通過設定上傳檔案最大大小的表單區域,即允許上傳檔案的最大值,max_file_size(隱藏範圍)的值來規定上傳檔案的大小,其實一般別人可以繞過這個值,所以安全起見,最好是在 php.ini 設定檔中配置 upload_max_filesize 選項,設定檔案上傳的大小。預設 upload_max_filesize = 2M,即檔案上傳的大小為2M,如果你想上傳超過8M的檔案,比如20M,你必須設定upload_max_filesize = 20M。
(5)post_max_size 這個值也必須足夠大。這個變數也是一個同表單提交相關的變數,它限制的是用戶端通過POST方法進行一次表單提交時PHP程式所能夠接收的最大資料量。一般情況下,將此值的值設定的比 upload_max_filesize 略大即可,比如要上傳20MB的檔案,此值可以設定為 21MB。
(6)max_input_time 此變數可以以秒為單位對通過POST、GET以及PUT方式接收資料時間進行限制。如果應用程式所運行環境處在網路比較慢的情況下,則需要增加此值以增大接收資料所需要的時間,比如將此值設定為 90秒。
max_input_time = 90
(7)memory_limit 也必須足夠大,為了避免正在啟動並執行指令碼大量使用系統可用記憶體,PHP允許定義記憶體使用量限額。通過memory_limit變數來指定單個指令碼程式可以使用的最大記憶體容量。變數memory_limit的值應當適當大於post_max_size的值。
(8)另外如果你的主機是 nginx 作業系統的話,如果以上操作都不行的話,記得在 nginx 的設定檔裡面加上 client_max_body_size 20m; 這樣一句,即表示最大允許上傳 20MB,具體根據自己的情況來。我的 nginx 設定檔的位置在 /usr/local/nginx/conf/nginx.conf。