日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

PHP大文件分片上传

發布時間:2025/3/18 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PHP大文件分片上传 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、前言

  • 在網站開發中,經常會有上傳文件的需求,有的文件size太大直接上傳,經常會導致上傳過程中耗時太久,大量占用帶寬資源,因此有了分片上傳。
  • 分片上傳主要是前端將一個較大的文件分成等分的幾片,標識當前分片是第幾片和總共幾片,待所有的分片均上傳成功的時候,在后臺進行合成文件即可。

二、開發過程中遇到的問題

  • 分片的時候每片該分多大size?太大會出現“413 request entity too large”
  • 分片上傳的時候并不是嚴格按照分片的序號順序上傳,如何判斷所有的分片均上傳成功?
  • 合成文件的時候如何判斷保證合成一個完整的文件而不出錯?多個分片同時上傳的時候,讀寫文件沒有獨占鎖的時候會導致合成錯誤。
  • 三、問題解決

  • 當出現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)先獲取當前分片是第幾片以及總共幾片

    (2)創建一個文件夾用來存儲所有的分片以及合成的文件

    (3)變量$done初始為true,用來判斷是否所有的分片都上傳完成,每個分片保存的時候使用分片序號作為文件名,然后判斷所有的分片文件是否存在

    (4)當$done===true的時候,代表所有分片上傳完成,合成文件。 $target變量代表合成后的文件名,file_exists判斷是否已經合成成功,然后追加方式創建打開文件,循環將每個分片內容寫入一個文件中。在讀取每個分片之前先判斷當前分片是否存在,是為了防止多個進程執行合成文件代碼塊的時候導致某個分片已經寫入刪除,最后導致合成的文件是不完整的,此時需要刪除合成的不完整的文件并退出exit當前進程。其中每個分片最好設置獨占鎖,flock($in, LOCK_EX),用來保證讀寫分片的時候其他進程不會操作該分片。最后刪除分片unlink以及釋放獨占鎖。

    總結

    以上是生活随笔為你收集整理的PHP大文件分片上传的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。