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应用的影响.
后续补充说明:
<code>info.php<?phpif( isset($_POST['submit']) ) { header('Content-Type: text/plain; charset=utf-8'); //chmod 777 uploads move_uploaded_file($_FILES['upload_file']['tmp_name'], 'uploads/'.$_FILES['upload_file']['name']); print_r($_FILES['upload_file']); exit();} else { header('Content-Type: text/html; charset=utf-8');}?> <meta charset="utf-8"> <title>PHP文件上传测试</title> <body> <!---ecms enctype="multipart/form-data" 以二进制格式POST传输数据 --> " method="POST" enctype="multipart/form-data"> <div>文件1 </div> <div></div> </code>
Nginx和PHP-FPM的工作进程都只开1个.
以2KB每秒上传图片:
<code>time trickle -s -u 2 curl \-F "action=info.php" \-F "[email protected];type=image/jpeg" \-F "submit=提交" \http://www.example.com/app/info.phpsudo netstat -antp|egrep "curl|nginx|fpm"</code>
发现只有nginx和curl处于ESTABLISHED状态,nginx和fpm都没有被阻塞.
<code>top -p 4075 <b style="color:transparent">本文来源gao@!dai!ma.com搞$$代^@码!网!</b><strong>搞gaodaima代码</strong>可见Nginx单线程.sudo strace -p 4075 可见Nginx调用recvfrom接收数据并且pwrite保存数据.sudo strace -p 13751 可见PHP-FPM是在Nginx接收完成用户上传的数据时才获取数据.</code>
既然如此,我上面设想的另开FPM进程池处理上传操作的用处就不是太大了.在文件上传过程中PHP-FPM并不会被阻塞,因为Nginx接收完上传的内容后才一次性交给PHP-FPM.
附:以2KB每秒下载图片
<code>time trickle -s -d 2 \wget http://www.example.com/app/uploads/linux.jpeg -O /dev/null</code>
使用第三方的断点续传控件(activex 控件)
比如 Xproer.HttpUploader5,类似 QQ 邮箱的超大附件
或者使用 SWFUpload ,据说最大支持到2G左右
php配置文件是可以改成比较大的,不过上传的东西比较大不做断点续传,实际在用的时候很难受的,经常断了只能重新传, https://github.com/blueimp/jQuery-File-Upload