V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zhengwhizz
V2EX  ›  PHP

PHP 打包几个 G,甚至 10 几个 G 的 zip 包

  •  
  •   zhengwhizz · 2019-06-11 18:40:46 +08:00 · 5790 次点击
    这是一个创建于 2021 天前的主题,其中的信息可能已经有所发展或是发生改变。

    从 阿里云 oss 打包十几 G 的 zip 包供下载,目前用的 flysystem zip ,发现都是在 3.6G 左右就打完,丢失了好多文件。请问有什么好方法避免内存不足?另外下载又有什么好方案,目前是打包到服务器 xsendfile 下载,但是服务器带宽有限,也不能断点续传,想着打包完后回传 oss 再下载,但是好像也不能断点吧?

    第 1 条附言  ·  2019-06-11 22:05:11 +08:00
    问题没说清楚,现补充如下:
    打哪些文件是根据数据库里的记录来定的,而且打包后的文件夹要根据记录所在城市及记录 ID 等字段来定,类似 北京 /朝阳 /地址 /ID ;不知道工具能不能提供类似功能?
    另外这是提供给客户的下载功能,并非自己人用的,即使规定让客户用什么 Util,他也不一定知道怎么用。
    第 2 条附言  ·  2019-06-11 22:07:13 +08:00
    另外,客户不止一家,A 只能下载他的记录相关文件,B C D 也如此。
    24 条回复    2019-06-13 19:51:11 +08:00
    vibbow
        1
    vibbow  
       2019-06-11 19:17:49 +08:00
    直接系统命令调用 7z 进行打包
    zhengwhizz
        2
    zhengwhizz  
    OP
       2019-06-11 20:03:46 +08:00
    @vibbow 能打包 oss 上的网络文件?几十万个文件的
    KasuganoSoras
        3
    KasuganoSoras  
       2019-06-11 20:09:16 +08:00
    修改 php.ini
    把 max_execution_time 参数调大一点
    把 memory_limit 调大一点
    最好用异步执行,或者命令行运行

    另外你说你服务器带宽有限,那打包完了回传到 OSS 和直接给用户下载有啥区别啊……(挠头
    最好是打包完了以后存到一个临时目录,然后让用户下载这个临时文件
    因为有 Nginx 或者 Apache 去处理静态文件下载,就支持断点续传了
    KasuganoSoras
        4
    KasuganoSoras  
       2019-06-11 20:11:58 +08:00
    最好就是搞个水管粗点的服务器,像国外便宜的 G 口服务器一大把,你只需要把下载文件这部分代码单独拎出来丢到下载服务器上去进行处理就好了,打包完了直接下载,不用搞什么回传 OSS。
    zhengwhizz
        5
    zhengwhizz  
    OP
       2019-06-11 20:15:57 +08:00
    @KasuganoSoras oss 和 web 服务器是阿里同一区域内网的。目前最大一个打包估计 15 个 G。。调参数之前就调了。现在下载的就是静态文件形式的。
    runtu2019
        6
    runtu2019  
       2019-06-11 20:31:18 +08:00
    阿里云提供了那么多 oss 工具不知道用,不知道怎么说你了
    先开通 ram 子账号,在下载 ossutil 工具或则其他 oss 工具,用 oss 外网地址进行连接
    丢在那下一个晚上不就好了,直接下载到本地,oss 按量付费,外网带宽费也不要太多钱吧
    0myun
        7
    0myun  
       2019-06-11 20:43:08 +08:00
    @KasuganoSoras #4 “,像国外便宜的 G 口服务器一大把,”?推荐推荐呗
    jimrok
        8
    jimrok  
       2019-06-11 20:49:26 +08:00
    有个 ossutil64 的命令,可以拷贝 oss 里的文件,你一个个目录拷贝,蚂蚁搬家如何?
    wslsq
        9
    wslsq  
       2019-06-11 22:11:55 +08:00
    队列执行命令运行吧
    zwl2012
        10
    zwl2012  
       2019-06-11 23:36:34 +08:00 via iPhone
    不是可以调用 shell 管道压缩传送吗
    zwl2012
        11
    zwl2012  
       2019-06-11 23:37:01 +08:00 via iPhone
    管道压缩占用的内存应该还行吧
    zwl2012
        12
    zwl2012  
       2019-06-11 23:37:11 +08:00 via iPhone
    虽然压缩比一般
    KasuganoSoras
        13
    KasuganoSoras  
       2019-06-11 23:46:28 +08:00   ❤️ 1
    @0myun #7 dedipath, nocix, onevps 这几个都是我常用的,搜一下名字就有,网上评测都很详细了
    KasuganoSoras
        14
    KasuganoSoras  
       2019-06-11 23:50:00 +08:00   ❤️ 1
    @0myun #7 另外你的账号可能被降权了,你回复我没提醒,我刚刚点进来看才发现
    chinesestudio
        15
    chinesestudio  
       2019-06-12 01:58:30 +08:00 via Android
    tar 有啥不好么
    also24
        16
    also24  
       2019-06-12 02:02:28 +08:00
    同问,为什么要用 zip,这种场景似乎更应该用 tar
    game69010
        17
    game69010  
       2019-06-12 08:07:33 +08:00
    开临时服务器下载就不会占用自己服务器资源,可以临时买个配置高点的,宽带 5m,一两元不到的成本就可以搞定了
    zhengwhizz
        18
    zhengwhizz  
    OP
       2019-06-12 11:52:15 +08:00 via Android
    @chinesestudio
    @also24 怎么用 tar 打包 网络上的文件,并且打包时按一定的文件夹命名? 如 北京 /朝阳 /100/aaa.jpg
    also24
        19
    also24  
       2019-06-12 11:58:15 +08:00
    @zhengwhizz #18
    还是要下载下来打包进去,推荐 tar 的原因主要有两个:
    1、tar 可以增补文件,也就是说你可以一个一个文件下载下来加进去,减少磁盘 /内存占用
    2、tar 是归档格式,只打包不压缩,减少 CPU/内存占用,提升打包速度
    Jeffrey4l
        20
    Jeffrey4l  
       2019-06-12 16:11:46 +08:00
    试试 zsync?
    zhengwhizz
        21
    zhengwhizz  
    OP
       2019-06-12 19:45:10 +08:00
    @also24 ok,我试试
    zhengwhizz
        22
    zhengwhizz  
    OP
       2019-06-12 23:32:03 +08:00
    @also24 我用 tar 打了中文乱码,有解决方法吗?换了 zip 倒是正常。
    also24
        23
    also24  
       2019-06-13 09:47:24 +08:00
    @zhengwhizz #22
    在 Windows 下解压的?应该是因为打包 /解压的地方字符集配置不一致导致的。

    可能需要配置打包服务器的字符集为 gb18030,或者解压那边自己手选一下字符集。
    zhengwhizz
        24
    zhengwhizz  
    OP
       2019-06-13 19:51:11 +08:00 via Android
    @also24 包是给客户下的,解压设不现实,服务器设的话不知道会不会产生副作用。换了 zip 命令打出来正常就用它了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5971 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 02:37 · PVG 10:37 · LAX 18:37 · JFK 21:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.