文件上传 - php上传大文件(100M以上)
PHPz
PHPz 2017-04-10 16:38:11
[PHP讨论组]

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

PHPz
PHPz

学习是最好的投资!

全部回复(3)
大家讲道理

服务器端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">
            <p>文件1 <input type="file" name="upload_file" /></p>
            <p><input type="submit" name="submit" value="提交" /></p>
        </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
大家讲道理

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

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

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

伊谢尔伦

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号