PHP大文件分片上傳的實(shí)現(xiàn)方法
一、前言
在網(wǎng)站開發(fā)中,經(jīng)常會(huì)有上傳文件的需求,有的文件size太大直接上傳,經(jīng)常會(huì)導(dǎo)致上傳過(guò)程中耗時(shí)太久,大量占用帶寬資源,因此有了分片上傳。
分片上傳主要是前端將一個(gè)較大的文件分成等分的幾片,標(biāo)識(shí)當(dāng)前分片是第幾片和總共幾片,待所有的分片均上傳成功的時(shí)候,在后臺(tái)進(jìn)行合成文件即可。
二、開發(fā)過(guò)程中遇到的問(wèn)題
- 分片的時(shí)候每片該分多大size?太大會(huì)出現(xiàn)“413 request entity too large”
- 分片上傳的時(shí)候并不是嚴(yán)格按照分片的序號(hào)順序上傳,如何判斷所有的分片均上傳成功?
- 合成文件的時(shí)候如何判斷保證合成一個(gè)完整的文件而不出錯(cuò)?多個(gè)分片同時(shí)上傳的時(shí)候,讀寫文件沒(méi)有獨(dú)占鎖的時(shí)候會(huì)導(dǎo)致合成錯(cuò)誤。
三、問(wèn)題解決
當(dāng)出現(xiàn)413的時(shí)候,修改了 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)建一個(gè)文件夾用來(lái)存儲(chǔ)所有的分片以及合成的文件
(3)變量$done初始為true,用來(lái)判斷是否所有的分片都上傳完成,每個(gè)分片保存的時(shí)候使用分片序號(hào)作為文件名,然后判斷所有的分片文件是否存在
(4)當(dāng)$done===true的時(shí)候,代表所有分片上傳完成,合成文件。
$target變量代表合成后的文件名,file_exists判斷是否已經(jīng)合成成功,然后追加方式創(chuàng)建打開文件,循環(huán)將每個(gè)分片內(nèi)容寫入一個(gè)文件中。
在讀取每個(gè)分片之前先判斷當(dāng)前分片是否存在,是為了防止多個(gè)進(jìn)程執(zhí)行合成文件代碼塊的時(shí)候?qū)е履硞€(gè)分片已經(jīng)寫入刪除,最后導(dǎo)致合成的文件是不完整的,此時(shí)需要?jiǎng)h除合成的不完整的文件并退出exit當(dāng)前進(jìn)程。
其中每個(gè)分片最好設(shè)置獨(dú)占鎖,flock($in, LOCK_EX),用來(lái)保證讀寫分片的時(shí)候其他進(jìn)程不會(huì)操作該分片。最后刪除分片unlink以及釋放獨(dú)占鎖。
總結(jié)
以上所述是小編給大家介紹的PHP大文件分片上傳的實(shí)現(xiàn)方法,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)歡迎給我留言,小編會(huì)及時(shí)回復(fù)大家的!
相關(guān)文章
php使HTML標(biāo)簽自動(dòng)補(bǔ)全閉合函數(shù)代碼
這個(gè)網(wǎng)上找到的自動(dòng)補(bǔ)全閉合函數(shù)還挺不錯(cuò)的,它可以根據(jù)你的html內(nèi)容自己補(bǔ)全閉合,確保HTMl代碼正確2012-10-10PHP讓網(wǎng)站移動(dòng)訪問(wèn)更加友好方法
在本文里我們給大家整理了關(guān)于PHP讓網(wǎng)站移動(dòng)訪問(wèn)更加友好的相關(guān)實(shí)例代碼以及相關(guān)知識(shí)點(diǎn),有需要的朋友們學(xué)習(xí)下。2019-02-02thinkPHP自動(dòng)驗(yàn)證機(jī)制詳解
這篇文章主要介紹了thinkPHP自動(dòng)驗(yàn)證機(jī)制,結(jié)合實(shí)例形式分析了thinkPHP自動(dòng)驗(yàn)證機(jī)制的格式、原理與具體操作技巧,需要的朋友可以參考下2016-12-12PHP array_reduce()函數(shù)的應(yīng)用解析
這篇文章主要介紹了PHP array_reduce()的應(yīng)用,本文通過(guò)代碼舉例給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-10-10Zend Framework框架的zend_cache緩存使用方法(zend框架)
這篇文章主要介紹了Zend_Cache文件緩存的基本操作,簡(jiǎn)單的示例,,需要的朋友可以參考下2014-03-03PHP簡(jiǎn)單實(shí)現(xiàn)圖片格式轉(zhuǎn)換(jpg轉(zhuǎn)png,gif轉(zhuǎn)png等)
這篇文章主要介紹了PHP簡(jiǎn)單實(shí)現(xiàn)圖片格式轉(zhuǎn)換(jpg轉(zhuǎn)png,gif轉(zhuǎn)png等),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10PHP的Laravel框架結(jié)合MySQL與Redis數(shù)據(jù)庫(kù)的使用部署
這篇文章主要介紹了PHP的Laravel框架結(jié)合MySQL與Redis數(shù)據(jù)庫(kù)的使用部署,需要的朋友可以參考下2016-03-03yii2.0數(shù)據(jù)庫(kù)遷移教程【多個(gè)數(shù)據(jù)庫(kù)同時(shí)同步數(shù)據(jù)】
這篇文章主要介紹了yii2.0數(shù)據(jù)庫(kù)遷移的方法,可實(shí)現(xiàn)多個(gè)數(shù)據(jù)庫(kù)同時(shí)同步數(shù)據(jù)的功能,較為詳細(xì)的分析了Yii2針對(duì)遷移的創(chuàng)建、提交、重做及自定義遷移的相關(guān)概念與使用方法,需要的朋友可以參考下2016-10-10利用PHP實(shí)現(xiàn)一個(gè)簡(jiǎn)單的用戶登記表示例
這篇文章主要給大家介紹了利用PHP實(shí)現(xiàn)一個(gè)簡(jiǎn)單的用戶登記表的相關(guān)資料,文中分別介紹了如何展示單行和多行信息表的實(shí)現(xiàn)方法,分別給出了詳細(xì)的示例代碼,需要的朋友可以參考簡(jiǎn)介,下面來(lái)一起看看吧。2017-04-04