使用PHP怎么對大文件進行分片上傳?相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
創(chuàng)新互聯(lián)建站是一家專注于成都網(wǎng)站設(shè)計、做網(wǎng)站與策劃設(shè)計,臺山網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)建站做網(wǎng)站,專注于網(wǎng)站建設(shè)10多年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:臺山等地區(qū)。臺山做網(wǎng)站價格咨詢:18980820575一、前言
在網(wǎng)站開發(fā)中,經(jīng)常會有上傳文件的需求,有的文件size太大直接上傳,經(jīng)常會導(dǎo)致上傳過程中耗時太久,大量占用帶寬資源,因此有了分片上傳。
分片上傳主要是前端將一個較大的文件分成等分的幾片,標(biāo)識當(dāng)前分片是第幾片和總共幾片,待所有的分片均上傳成功的時候,在后臺進行合成文件即可。
二、開發(fā)過程中遇到的問題
分片的時候每片該分多大size?太大會出現(xiàn)“413 request entity too large”
分片上傳的時候并不是嚴(yán)格按照分片的序號順序上傳,如何判斷所有的分片均上傳成功?
合成文件的時候如何判斷保證合成一個完整的文件而不出錯?多個分片同時上傳的時候,讀寫文件沒有獨占鎖的時候會導(dǎo)致合成錯誤。
三、問題解決
當(dāng)出現(xiàn)413的時候,修改了 nginx.conf 和php.ini
(1)nginx中添加client_max_body_size和client_body_buffer_size
(2)php.ini添加post_max_size 和 upload_max_filesize
重啟nginx和php-fpm
代碼邏輯梳理和分享
(1)先獲取當(dāng)前分片是第幾片以及總共幾片
(2)創(chuàng)建一個文件夾用來存儲所有的分片以及合成的文件
(3)變量$done初始為true,用來判斷是否所有的分片都上傳完成,每個分片保存的時候使用分片序號作為文件名,然后判斷所有的分片文件是否存在
(4)當(dāng)$done===true的時候,代表所有分片上傳完成,合成文件。
$target變量代表合成后的文件名,file_exists判斷是否已經(jīng)合成成功,然后追加方式創(chuàng)建打開文件,循環(huán)將每個分片內(nèi)容寫入一個文件中。
在讀取每個分片之前先判斷當(dāng)前分片是否存在,是為了防止多個進程執(zhí)行合成文件代碼塊的時候?qū)е履硞€分片已經(jīng)寫入刪除,最后導(dǎo)致合成的文件是不完整的,此時需要刪除合成的不完整的文件并退出exit當(dāng)前進程。
其中每個分片好設(shè)置獨占鎖,flock($in, LOCK_EX),用來保證讀寫分片的時候其他進程不會操作該分片。最后刪除分片unlink以及釋放獨占鎖。
看完上述內(nèi)容,你們掌握使用PHP怎么對大文件進行分片上傳的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!