首页 > php上传大文件(100M以上)

php上传大文件(100M以上)

php如何上传大文件,配置里好像最大设置成8M,我想知道对于一个几百M的文件如何上传(不使用专门的客户端软件),好像是要分片什么的,有知道具体如何做的吗


php配置文件是可以改成比较大的,不过上传的东西比较大不做断点续传,实际在用的时候很难受的,经常断了只能重新传, https://github.com/blueimp/jQuery-File-Upload


使用第三方的断点续传控件(activex 控件)

比如 Xproer.HttpUploader5,类似 QQ 邮箱的超大附件

或者使用 SWFUpload ,据说最大支持到2G左右


服务器端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
if( 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');
}
?>
<!DOCTYPE HTML>
<html>
    <head>
        <meta charset="utf-8">
        <title>PHP文件上传测试</title>
    </head>
    <body>
        <!-- enctype="multipart/form-data" 以二进制格式POST传输数据 -->
        <form action="<?php echo pathinfo(__FILE__)['basename']; ?>" method="POST" enctype="multipart/form-data">
            <div>文件1 <input type="file" name="upload_file" /></div>
            <div><input type="submit" name="submit" value="提交" /></div>
        </form>
    </body>
</html>

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
【热门文章】
【热门文章】