PHP 高并发大图片上传怎么架构 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zhengwhizz
V2EX    PHP

PHP 高并发大图片上传怎么架构

  •  
  •   zhengwhizz 2019-05-07 14:39:05 +08:00 7031 次点击
    这是一个创建于 2349 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有个网站有时会涉及几百号人同时上传 2M 左右的图片好多张,这种情况下经常会丢失图片,怎么处理好呢?

    50 条回复    2019-05-08 09:38:14 +08:00
    sujin190
        1
    sujin190  
       2019-05-07 14:50:36 +08:00   1
    用又拍或者七牛
    HanSonJ
        2
    HanSonJ  
       2019-05-07 15:10:03 +08:00
    前端上传
    itchihuo
        3
    itchihuo  
       2019-05-07 15:10:41 +08:00
    1 楼正解,直接前端上传云存储平台
    tanszhe
        4
    tanszhe  
       2019-05-07 15:26:34 +08:00
    关键在带宽
    DefineJ
        5
    DefineJ  
       2019-05-07 15:32:51 +08:00
    一定要自己的服务器搞个队列也行
    keepeye
        6
    keepeye  
       2019-05-07 15:36:04 +08:00
    我觉得还是先搞清楚为什么会丢失图片比较好
    googlecomhk
        7
    googlecomhk  
       2019-05-07 15:37:52 +08:00 via Android
    feiandxs
        8
    feiandxs  
       2019-05-07 15:39:32 +08:00
    我觉得这里搞清思路找到问题所在就好,但这个场景下造轮子真的是最没有必要的。。

    1 效果没前端直传第三方好。
    2 造一遍也是各种封装,还涉及 token 鉴权之类的,开发成本高。
    3 你造出来也没人家好,从业务角度来说就不该考虑。
    4 也不用担心第三方平台倒闭之类的。。。带宽足,成本低,一般倒的比别家公司还晚。。。

    就知识可以学学,自己再试图强行搞定高并发下的图片上传,又费钱又费人还学不到啥。。。
    cnbattle
        9
    cnbattle  
       2019-05-07 16:39:20 +08:00
    同 1 楼 直接往第三方上面怼
    zhengwhizz
        10
    zhengwhizz  
    OP
       2019-05-07 20:13:43 +08:00
    @sujin190
    @itchihuo
    @cnbattle 项目涉及到使用这些图片生成 PDF 还有打包下载,很多地方用到这些图片,怼云存储要调整好多地方,甲方不加资金没得搞,现在我就想弄清楚,如果在自己服怎么搞能避免丢失
    zhengwhizz
        11
    zhengwhizz  
    OP
       2019-05-07 20:17:57 +08:00
    @keepeye 丢图应该就是处理不过来挂了,反正很怪异,没任何规律,重名也不可能,重名覆盖的话数据库有记录至少会破图,上传的时候 3-4 天有 40G 的量,时间点上来说还相对集中。
    plqws
        12
    plqws  
       2019-05-07 20:21:40 +08:00
    几百人同时上传 2M 的图片并不是什么大压力的场景啊,难道不是代码逻辑有问题吗
    zhengwhizz
        13
    zhengwhizz  
    OP
       2019-05-07 20:39:17 +08:00
    @plqws 问题服务器只有 4M 带宽,并且上传的时候每个人都是一批的传,同时有对图片生成缩略图的操作,并且有些还有水印操作,也就是每个人估算会传十几二十张甚至更多,虽然并发时不一定有几百人,从以往的数据量来看,3 天左右 40G 的量,时间也相对集中。
    zhengwhizz
        14
    zhengwhizz  
    OP
       2019-05-07 20:41:03 +08:00
    @plqws 有没有什么方法检测到当时的并发量?或者图片上传请求量?
    ouou8
        15
    ouou8  
       2019-05-07 21:01:28 +08:00
    @zhengwhizz 暂时没有办法解决的情况下,你先限制一下每人一次只能上传图片的数量,比如一次最多只能上传 20 张,甚至更少一些。
    mamahaha
        16
    mamahaha  
       2019-05-07 21:01:48 +08:00
    你介四传的太慢超时了啊,ini 里可以调节一下,要想可靠就做队列或断点续传,断点续传的工具很多的一搜一堆。
    server
        17
    server  
       2019-05-07 21:08:52 +08:00
    临时授权,不过低版本 ie 不行, https://help.aliyun.com/document_detail/31953.html
    zhengwhizz
        18
    zhengwhizz  
    OP
       2019-05-07 21:12:56 +08:00
    @mamahaha 接收代码里直接设置 0 的,
    zhengwhizz
        19
    zhengwhizz  
    OP
       2019-05-07 21:14:47 +08:00
    @ouou8 客户不让限,而且也不让压,本来可以客户端压一下,但是客户看图片质量就看 KB 数。
    dobelee
        20
    dobelee  
       2019-05-07 21:15:54 +08:00 via Android   2
    几百个人同时上传 2m 图片,带宽只有 4m。
    这个背景下讨论架构有意义?
    shiny
        21
    shiny  
       2019-05-07 21:16:23 +08:00
    云服务器流入的带宽不是没什么限制吗
    opengps
        22
    opengps  
       2019-05-07 21:41:53 +08:00
    如果是阿里云的话:
    正常使用服务器的带宽上传,然后服务器内网传输给 OSS,然后引用地址返回 OSS 的公网地址。参考我的博客最后两段 https://www.opengps.cn/Blog/View.aspx?id=43&from=v2
    king2014
        23
    king2014  
       2019-05-07 21:44:39 +08:00
    10M 的带宽 8 核 16g 的机子,7 天有 3000 个人上传手机照片(手机照片不小 7,8M 有的),整个活动下来没有出现问题,可能并发没有我想的那么高的缘故吧
    2kCS5c0b0ITXE5k2
        24
    2kCS5c0b0ITXE5k2  
       2019-05-07 21:45:13 +08:00
    带宽问题吧. 4m 水管单传一个 2m 的图片都要 2 秒了 更别说同时了
    king2014
        25
    king2014  
       2019-05-07 21:57:13 +08:00
    每个人估算会传十几二十张甚至更多,每张图片 2M。。。这还怎么搞?
    相当于一个人就要上传 20M-40M 的图片,再来个 100 并发岂不是瞬间上传 2G-4G 的图片,几百号人岂不是更多。。。
    veike
        26
    veike  
       2019-05-07 21:57:31 +08:00
    @emeab 上传时间要看文件大小单位,服务器 4M 是 bit,文件是 byte,所以 2s 传不完。
    opengps
        27
    opengps  
       2019-05-07 21:58:31 +08:00
    22 楼补充:
    对于传统机房的对等带宽,除了加带宽没别的办法。
    对于国内各种云,带宽几乎全是只限制服务器出方向大小(入方向一般是 100M 或 200M 并且免费)。对象存储都是按流量收费,峰值带宽往往是 100M 起步
    所以,这个问题可以用内网可打通的云服务器和对象存储搭配解决
    veike
        28
    veike  
       2019-05-07 22:05:17 +08:00
    @opengps 上行真的有那么大吗?
    yc8332
        29
    yc8332  
       2019-05-07 22:08:14 +08:00
    第三方存储服务搞起来。。。
    KasuganoSoras
        30
    KasuganoSoras  
       2019-05-07 22:11:57 +08:00
    你要是只有 4M 宽带,就算你把程序优化成神仙也没用,速度还是只有 4M,就那个样
    解决方法就是加宽带,或者用第三方储存服务
    opengps
        31
    opengps  
       2019-05-07 22:15:59 +08:00
    @veike 阿里云官网给出解释:按量付费的带宽上限是 100M,按固定带宽付费的上限是 200M
    opengps
        33
    opengps  
       2019-05-07 22:20:34 +08:00
    新找的图床好像不太好用,倒数第二个图片链接是官网文档截图
    zhengwhizz
        34
    zhengwhizz  
    OP
       2019-05-07 22:46:28 +08:00
    @opengps 你是说上传图片的时候带宽并不是 4M?? 而是 100-200M ?只是访问的时候是 4M ?
    opengps
        35
    opengps  
       2019-05-07 22:49:29 +08:00
    @zhengwhizz 是的。注意前提条件是:你用的是云服务器这种“非对等”带宽
    zhengwhizz
        36
    zhengwhizz  
    OP
       2019-05-07 23:05:27 +08:00
    @opengps 用的就是阿里,我也看了阿里的说明,这么说的话上传的瓶颈其实就是用户端这边了,但是这边只有他一人在传,假如同一时间有 10 个人在传,每人 6M,服务器处理 60M 的图片进行压缩 /打水印,是服务器运力不够了?服务器好像是 4 核 8G。
    opengps
        37
    opengps  
       2019-05-07 23:20:53 +08:00   1
    @zhengwhizz 你好像没 get 到我的点,我不是说你上传不够。
    我是说你的上传之后的引用加载,占用了服务器的 4M 带宽,导致交互通讯时候有一个方向受阻了,可能在这个地方导致的其他人失败(上传过程也会需要一点下载流量的)
    jugelizi
        38
    jugelizi  
       2019-05-07 23:40:34 +08:00
    怎么看上去就是发包攻击了
    mumbler
        39
    mumbler  
       2019-05-07 23:45:51 +08:00
    阿里云的 ECS 和 OSS 上行数据都是免费的,最高 1G 带宽,4M 只是下行带宽而已.
    z5864703
        40
    z5864703  
       2019-05-08 00:49:16 +08:00
    应该就是像 37 楼所说,上传没问题,只是因为页面展示图片的时候把 4M 的出网带宽占满导致别的入网请求交互握手阻塞。
    如果是这种,可以考虑把页面展示的使用缩略图,压缩出网带宽开销
    2kCS5c0b0ITXE5k2
        41
    2kCS5c0b0ITXE5k2  
       2019-05-08 01:30:57 +08:00
    @z5864703 再怎么压缩 并发那么高的话 4m 怎么够
    akira
        42
    akira  
       2019-05-08 03:13:05 +08:00
    直传 3 方存储 是最好的方案了
    zhengwhizz
        43
    zhengwhizz  
    OP
       2019-05-08 07:35:21 +08:00
    @opengps 了解了,应该就是这原因了
    zjsxwc
        44
    zjsxwc  
       2019-05-08 08:18:21 +08:00 via Android
    七牛或别的 提供 token 前端上传
    liuyang3688
        45
    liuyang3688  
       2019-05-08 08:37:11 +08:00
    同意 37 楼和 40 楼 通过服务器端验证下 就知道有没有上传成功。如果确实是上传成功后 拉取图片显示的问题 那么服务端生成缩略图可解 但是高并发下 即便是缩略图 也要考虑你的 4m 带宽

    上云 引用地址最靠谱
    lscho
        46
    lscho  
       2019-05-08 09:14:36 +08:00
    4m 带宽谈什么架构。。。。
    luozic
        47
    luozic  
       2019-05-08 09:18:13 +08:00
    4m 出口 要上片? 哈哈哈哈哈哈哈哈哈
    fuxkcsdn
        48
    fuxkcsdn  
       2019-05-08 09:27:22 +08:00 via iPhone
    如果上传带宽没问题,那就上队列,4 核 8G 应对这个量足够了
    web 只负责接收图片并把图片移动到指定目录,然后任务入列,之后由队列处理后续事宜
    qbhy
        49
    qbhy  
       2019-05-08 09:35:42 +08:00
    前端上传到云存储就行了,php 生成个 token 就好,压力不大
    opengps
        50
    opengps  
       2019-05-08 09:38:14 +08:00 via Android
    前端上传有风险,你自己能上传的同时别人也能上传,慎用!
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5530 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 08:48 PVG 16:48 LAX 01:48 JFK 04:48
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86