请教一个文件上传时间很长的问题

1. 运行环境

centos

1). 当前使用的 Laravel 版本?

laravel5.8

2). 当前使用的 php/php-fpm 版本?

PHP 版本:7.4

php-fpm 版本:7.4

3). 当前系统

centos, 4C8G

5). 相关软件版本

lnmp架构
nginx配置:

请教一个文件上传的问题
php配置:

请教一个文件上传的问题

2. 问题描述?

在后台进行文件上传,使用的是el-upload

这是前端相关代码

//页面代码
<el-upload
  :action="action"
  ref="upload"
  accept="application/zip"
  :on-remove="removeFile"
  :auto-upload="true"
  :file-list="fileList"
  :http-request="uploadFile"
  :on-change="handleChange"
>
  <el-button :loading="progress" slot="trigger" size="mini" type="primary">
    {{ progress ? '上传中' : '选择文件' }}
  </el-button>
  <el-alert
  class="pd10"
  size="mini"
  :closable="false"
  title="仅支持zip格式,上传后如需修改,则再次点击“选择文件”重新上传即可"
  type="info"
  />
</el-upload>

//页面上传方法
 async uploadFile({file}) {
      const isZip = file.name.endsWith('.zip');
      if (!isZip) {
        this.fileList = []
        this.$message.error('请选择zip文件!');
        return false;
      }
      const {progress} = this
      if (!progress) {
        this.progress = true
        this.disabled = true
        this.saving = true
        await this.$api.storage.Parse_file(file).then((res) => {

            console.log(res)
        })
      }
    },

    //上传接口
Parse_file(file) {
  return createCancellablePromise(
      async (resolve, reject, setCancel) => {
      try {
          const rp = readBlobAs(file, 'ArrayBuffer')

          setCancel(rp.cancel)
          let data = await rp
          const hash = md5(data)

          let param = new FormData();
          param.append('file', file);
          param.append('hash', hash);

          const res =await http.post('/upload',param,{
                  headers: { 'Content-Type': 'multipart/form-data' },
                  validateStatus: s => s === 200 || s === 201,
                  cancelToken: new admin.CancelToken(setCancel)
      })
        resolve(res)
      } catch (err) {
        reject(http.isCancel(err) ? createCancel() : err)
      }})
}

//后端代码

public function upload(Request $request){
    $file = $request->file('file');
    //后面是具体业务逻辑,解压读取内容之类的
}

现在的问题是,从页面发起请求到后端接收file这段时间很长,大概150M的zip上传要执行差不多2分钟

这个是上传差不多111M的时间
请教一个文件上传的问题

3. 您期望得到的结果?

想请问一下,这个时间这么长是和什么有关系呢?或者有什么方法优化一下呢?

心之所向,素履以往。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

哪家云服务商啊

如果是阿里云,腾讯云的话,按宽带计费是这样的,带宽低于10M的,上传速度就是10Mbp/s,差不多1.25M/s,150M大小文件就需要120秒,正好两分钟,高于10M的就是上下行对等,你想快就开按量付费宽带拉到最大或者用oss

1年前 评论
抄你码科技有限公司 1年前
lmdfx (楼主) 1年前
讨论数量: 13
cnguu

看下服务器带宽,上传是不是已经是最大的速度了

1年前 评论
lmdfx (楼主) 1年前
Complicated

我刚最近做的项目是 60m,上传18s

1年前 评论
Complicated

我感觉不是代码的问题呢,我也没做任何优化

1年前 评论

上传受本地宽带的上行速率影响。优先检查这个值。如果本地就1M多上行速度。那么其实这个结果没啥问题。
要是本地上行还有余量的话。
服务器一般是上行不限速。基本可以按照等于你服务器的下行速度理解。
那么可以考虑使用分包上传来提升这个效率。
提供一段代码作为参考。传到后端再进行合并

        //计算文件切片总数
        totalPieces = Math.ceil(filesize / bytesPerPiece);
        while(start < filesize) {
            end = start + bytesPerPiece;
            if(end > filesize) {
                end = filesize;
            } // 匹配最后一个分片的情况

            var chunk = blob.slice(start,end);//切割文件    
            var sliceIndex= blob.name + index;
            var formData = new FormData();
            formData.append("file", chunk, sliceIndex);
            $.ajax({
                url: 'http://localhost:9999/test.php',
                type: 'POST',
                cache: false,
                data: formData,
                processData: false,
                contentType: false,
            }).done(function(res){ 

            }).fail(function(res) {

            });
            start = end;
            index++;
        }
    }
</script>
1年前 评论
air93610 (作者) 1年前

哪家云服务商啊

如果是阿里云,腾讯云的话,按宽带计费是这样的,带宽低于10M的,上传速度就是10Mbp/s,差不多1.25M/s,150M大小文件就需要120秒,正好两分钟,高于10M的就是上下行对等,你想快就开按量付费宽带拉到最大或者用oss

1年前 评论
抄你码科技有限公司 1年前
lmdfx (楼主) 1年前

先把业务逻辑屏蔽,看看单上传的耗时是多少,如果是业务逻辑导致的耗时,可以做成异步的,如果单上传就很耗时就可以考虑切片啥的

1年前 评论

为什么要上传到自己的服务器呀, 让前端上传到 云服务器上 然后返回给你一个唯一标识就好了, 不然你的服务要被打爆

1年前 评论

分片上传

1年前 评论
lmdfx (楼主) 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!