php上傳大文件失敗的原因及應(yīng)對(duì)策略
為什么上傳大文件總是失敗,但是上傳小文件就沒(méi)有問(wèn)題。小編也不得其解,網(wǎng)上搜其原因,整理了一篇關(guān)于php上傳大文件失敗的原因和解決辦法的文章,分享給大家。

下面分別是各種原因以及解決辦法:
第1種情況:文件上傳時(shí)存放文件的臨時(shí)目錄必須是開(kāi)啟的并且是 PHP 進(jìn)程所有者用戶可寫(xiě)的目錄。如果未指定則 PHP 使用系統(tǒng)默認(rèn)值。
php.ini文件中upload_tmp_dir用來(lái)說(shuō)明PHP上傳的文件放置的臨時(shí)目錄,要想上傳文件,得保證服務(wù)器沒(méi)有關(guān)閉臨時(shí)文件并對(duì)該文件夾有寫(xiě)入的權(quán)限。
第2種情況:max_execution_time 的值必須足夠大。變量 max_execution_time 設(shè)置了在強(qiáng)制終止腳本前PHP等待腳本執(zhí)行完畢的時(shí)間,此時(shí)間以秒計(jì)算。當(dāng)腳本進(jìn)入了一個(gè)無(wú)限循環(huán)狀態(tài)時(shí)此變量非常有用。然而,當(dāng)存在一個(gè)需要很長(zhǎng)時(shí)間完成的合法活動(dòng)時(shí)(例如上傳大型文件),這項(xiàng)功能也會(huì)導(dǎo)致操作失敗。在這樣的情況下必須考慮將此變量值增大,以避免PHP在腳本正在執(zhí)行某些重要過(guò)程的時(shí)候?qū)⒛_本關(guān)閉,例如設(shè)置為 90 秒。
max_execution_time = 90
注意在php函數(shù)中還有個(gè)set_time_limit 函數(shù),和以上這個(gè)設(shè)置的作用是相同的,這兩者的區(qū)別就是 以上是在 php.ini 文件中設(shè)置的,而set_time_limit 是寫(xiě)在php文件中的。所以也可以通過(guò)在頁(yè)面中用 set_time_limit 設(shè)置程序的最長(zhǎng)執(zhí)行時(shí)間,比如無(wú)限制即:set_time_limit(0);
第3種情況:file_uploads = On 默認(rèn)值為on,意思是允許通過(guò) HTTP 進(jìn)行文件上傳,此選項(xiàng)不能設(shè)置為OFF。
第4種情況:upload_max_filesize = 2M 設(shè)定文件上傳的大小的最大值,php.ini配置文件中的默認(rèn)文件上傳大小為2M,php初學(xué)者容易犯的一個(gè)錯(cuò)誤是在編寫(xiě)文件上傳功能時(shí)通過(guò)設(shè)置上傳文件最大大小的表單區(qū)域,即允許上傳文件的最大值,max_file_size(隱藏值域)的值來(lái)規(guī)定上傳文件的大小,其實(shí)一般別人可以繞過(guò)這個(gè)值,所以安全起見(jiàn),最好是在 php.ini 配置文件中配置 upload_max_filesize 選項(xiàng),設(shè)定文件上傳的大小。默認(rèn) upload_max_filesize = 2M,即文件上傳的大小為2M,如果你想上傳超過(guò)8M的文件,比如20M,你必須設(shè)定upload_max_filesize = 20M。
第5種情況:post_max_size 這個(gè)值也必須足夠大。這個(gè)變量也是一個(gè)同表單提交相關(guān)的變量,它限制的是客戶端通過(guò)POST方法進(jìn)行一次表單提交時(shí)PHP程序所能夠接收的最大數(shù)據(jù)量。一般情況下,將此值的值設(shè)置的比 upload_max_filesize 略大即可,比如要上傳20MB的文件,此值可以設(shè)置為 21MB。
第6種情況:max_input_time 此變量可以以秒為單位對(duì)通過(guò)POST、GET以及PUT方式接收數(shù)據(jù)時(shí)間進(jìn)行限制。如果應(yīng)用程序所運(yùn)行環(huán)境處在網(wǎng)絡(luò)比較慢的情況下,則需要增加此值以增大接收數(shù)據(jù)所需要的時(shí)間,比如將此值設(shè)置為 90秒。
max_input_time = 90
第7種情況:memory_limit 也必須足夠大,為了避免正在運(yùn)行的腳本大量使用系統(tǒng)可用內(nèi)存,PHP允許定義內(nèi)存使用限額。通過(guò)memory_limit變量來(lái)指定單個(gè)腳本程序可以使用的最大內(nèi)存容量。變量memory_limit的值應(yīng)當(dāng)適當(dāng)大于post_max_size的值。
第8種情況:另外如果你的主機(jī)是 nginx 操作系統(tǒng)的話,如果以上操作都不行的話,記得在nginx 的配置文件里面加上 client_max_body_size 20m; 這樣一句,即表示最大允許上傳20MB,具體根據(jù)自己的情況來(lái)。我的nginx 配置文件的位置在 /usr/local/nginx/conf/nginx.conf。
閱讀完這篇文章大家應(yīng)該大概知道大文件上傳失敗的原因了吧,希望本文可以為大家提供一些思路,更好的去解決類似問(wèn)題。
相關(guān)文章
PHP創(chuàng)建文件及寫(xiě)入數(shù)據(jù)(覆蓋寫(xiě)入,追加寫(xiě)入)的方法詳解
這篇文章主要介紹了PHP創(chuàng)建文件及寫(xiě)入數(shù)據(jù)(覆蓋寫(xiě)入,追加寫(xiě)入)的方法,結(jié)合實(shí)例形式總結(jié)分析了php文件創(chuàng)建、寫(xiě)入操作相關(guān)函數(shù)使用技巧,需要的朋友可以參考下2019-02-02
PHP單例模式數(shù)據(jù)庫(kù)連接類與頁(yè)面靜態(tài)化實(shí)現(xiàn)方法
這篇文章主要介紹了PHP單例模式數(shù)據(jù)庫(kù)連接類與頁(yè)面靜態(tài)化實(shí)現(xiàn)方法,涉及php面向?qū)ο髥卫J綌?shù)據(jù)庫(kù)連接類的定義與使用方法,以及緩存實(shí)現(xiàn)頁(yè)面靜態(tài)化相關(guān)操作技巧,需要的朋友可以參考下2019-03-03
php實(shí)現(xiàn)把url轉(zhuǎn)換迅雷thunder資源下載地址的方法
這篇文章主要介紹了php實(shí)現(xiàn)把url轉(zhuǎn)換迅雷thunder資源下載地址的方法,采用很簡(jiǎn)單的base64_encode編碼即可實(shí)現(xiàn)該功能,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-11-11
php 讀取shell管道傳輸過(guò)來(lái)的內(nèi)容
已經(jīng)寫(xiě)了不少后臺(tái)運(yùn)行的deamon了.用的挺順手的,但是我現(xiàn)在想獲取管道傳過(guò)來(lái)的內(nèi)容,不知道咋實(shí)現(xiàn),類似echo "aaaa" |a.php,a.php怎么獲得echo的內(nèi)容,不知道您有什么高見(jiàn).2010-03-03
php創(chuàng)建多級(jí)目錄與級(jí)聯(lián)刪除文件的方法示例
這篇文章主要介紹了php創(chuàng)建多級(jí)目錄與級(jí)聯(lián)刪除文件的方法,結(jié)合實(shí)例形式分析了php使用mkdir創(chuàng)建多級(jí)目錄與unlink結(jié)合rmdir遞歸刪除多級(jí)目錄相關(guān)操作技巧,需要的朋友可以參考下2019-09-09
PHP創(chuàng)建文件,并向文件中寫(xiě)入數(shù)據(jù),覆蓋,追加的實(shí)現(xiàn)代碼
這篇文章主要介紹了PHP創(chuàng)建文件,并向文件中寫(xiě)入數(shù)據(jù),覆蓋,追加的實(shí)現(xiàn)代碼,需要的朋友可以參考下2016-03-03
推薦學(xué)習(xí)php sesson的朋友必看PHP會(huì)話(Session)使用入門(mén)
對(duì)比起 Cookie,Session 是存儲(chǔ)在服務(wù)器端的會(huì)話,相對(duì)安全,并且不像 Cookie 那樣有存儲(chǔ)長(zhǎng)度限制,本文簡(jiǎn)單介紹 Session 的使用。2008-08-08
PHP判斷一個(gè)數(shù)組是另一個(gè)數(shù)組子集的方法詳解
這篇文章主要介紹了PHP判斷一個(gè)數(shù)組是另一個(gè)數(shù)組子集的方法,結(jié)合實(shí)例形式分析了php循環(huán)遍歷、array_diff及array_intersect函數(shù)等方法實(shí)現(xiàn)數(shù)組子集判斷的相關(guān)操作技巧,需要的朋友可以參考下2017-07-07

