php如何上傳大檔案,配置裡好像最大設定成8M,我想知道對於一個幾百M的檔案如何上傳(不使用專門的用戶端軟體),好像是要分區什麼的,有知道具體如何做的嗎
回複內容:
php如何上傳大檔案,配置裡好像最大設定成8M,我想知道對於一個幾百M的檔案如何上傳(不使用專門的用戶端軟體),好像是要分區什麼的,有知道具體如何做的嗎
伺服器端Apache/Nginx是支援斷點續傳的,用戶端cURL也是支援斷點續傳的.
瀏覽器預設支援下載斷點續傳,可以用jQuery-File-Upload實現分塊上傳和斷點續傳,伺服器則用PHP實現接收.
https://github.com/blueimp/jQuery-File-Upload/wiki/Chunked-file-uploads#resuming-file-uploads
https://github.com/blueimp/jQuery-File-Upload/blob/master/server/php/UploadHandler.php
為了避免大檔案上傳阻塞PHP服務,可以單獨開一個用於上傳的PHP-FPM進程池,利用PHP-FPM提供的池的隔離性,分離計算密集和I/O密集(上傳)操作,可以減少阻塞對整個PHP應用的影響.
後續補充說明:
info.php PHP檔案上傳測試
Nginx和PHP-FPM的背景工作處理序都只開1個.
以2KB每秒上傳圖片:
time trickle -s -u 2 curl \-F "action=info.php" \-F "upload_file=@linux.jpeg;type=image/jpeg" \-F "submit=提交" \http://www.example.com/app/info.phpsudo netstat -antp|egrep "curl|nginx|fpm"
發現只有nginx和curl處於ESTABLISHED狀態,nginx和fpm都沒有被阻塞.
top -p 4075 可見Nginx單線程.sudo strace -p 4075 可見Nginx調用recvfrom接收資料並且pwrite儲存資料.sudo strace -p 13751 可見PHP-FPM是在Nginx接收完成使用者上傳的資料時才擷取資料.
既然如此,我上面設想的另開FPM進程池處理上傳操作的用處就不是太大了.在檔案上傳過程中PHP-FPM並不會被阻塞,因為Nginx接收完上傳的內容後才一次性交給PHP-FPM.
附:以2KB每秒下載圖片
time trickle -s -d 2 \wget http://www.example.com/app/uploads/linux.jpeg -O /dev/null
使用第三方的斷點續傳控制項(activex 控制項)
比如 Xproer.HttpUploader5,類似 QQ 郵箱的超大附件
或者使用 SWFUpload ,據說最大支援到2G左右
php設定檔是可以改成比較大的,不過上傳的東西比較大不做斷點續傳,實際在用的時候很難受的,經常斷了只能重新傳, https://github.com/blueimp/jQuery-File-Upload