时间:2021-07-01 10:21:17 帮助过:3人阅读
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.php
sudo 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