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

如何在 PHP Shell 脚本中生成一个文件并上传到服务器?

  •  
  •   tanteng · 2016-03-09 23:41:38 +08:00 · 2726 次点击
    这是一个创建于 2976 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我需要通过 PHP 脚本生成一个文件(如 excel )并上传到服务器,供用户下载。

    一般文件不大的情况,用户在页面上点击下载,再去数据库取数据,设置 heder 头以流的形式输出到浏览器,并且制定文件类型的方式下载,这当然是可以的,但是问题是现在生成一个文件可能非常大,并且很耗时,所以要做成异步的方式,用户点击下载就入一个任务到队列,在 Shell 脚本中以计划任务的形式读取队列任务,然后生成一个文件并且上传到服务器呢,这种情况如何解决?

    9 条回复    2016-03-10 08:54:23 +08:00
    tanteng
        1
    tanteng  
    OP
       2016-03-09 23:47:17 +08:00
    我尝试在 PHP 中创建一个临时文件,把数据写到临时文件,但是发现这个临时文件是 resource 类型,无法通过上次函数上传,函数参数要求必须是目录名称,而传进去的是资源型
    Felldeadbird
        2
    Felldeadbird  
       2016-03-10 00:02:19 +08:00 via iPhone
    可以 php 生成文件,然后交由 shell 脚本做上传…
    mhycy
        3
    mhycy  
       2016-03-10 01:35:20 +08:00
    上传文件用 CURL 即可

    但是用户点击下载就加入队列,那么不是等于用户啥都没收到么?
    剩下的操作如何实现?
    zhs227
        4
    zhs227  
       2016-03-10 01:48:03 +08:00
    PHP 的脚本一般是只能运行几十秒的,在 WEB 环境上不适合跑耗时任务。应该弄个队列,队列由其它方式来处理,比如 PHP CLI , Python 等,处理完了以后再调用回调设置 Web 端状态。
    Strikeactor
        5
    Strikeactor  
       2016-03-10 01:48:32 +08:00
    PHP 运行环境和文件下载服务器分开的?
    我感觉折腾上传你不如搞个反代,用户点击完在 PHP 运行环境本地生成文件,然后返回远程服务器地址的 302 跳转,远程的下载服务器反代你 PHP 运行环境的目录,需要维持供后续下载的话就在反代上再设置一层缓存
    yangqi
        6
    yangqi  
       2016-03-10 05:15:37 +08:00
    你需要的是一个 queue, beanstalkd

    http://kr.github.io/beanstalkd/
    techmoe
        7
    techmoe  
       2016-03-10 06:13:32 +08:00 via Android
    点下载加到队列里后台写接口前端写轮询过去查进度呗。。
    dawniii
        8
    dawniii  
       2016-03-10 08:44:44 +08:00
    加入队列了,用户什么也下载不到,前端轮询去等队列吗。貌似还是很耗时?

    还有就是,本来就在服务器生成了,为何还要上传呢。。。

    如果大家下载的文件内容都相同的话,我建议你可以写个计划任务,例如每小时在服务器更新一次这个文件。下载地址不变。
    ershisi
        9
    ershisi  
       2016-03-10 08:54:23 +08:00
    远程的服务器是可控的不?如果是可控的。你在远程服务器上写一个接口,然后本地 curl 一下获取返回的地址就可以了。没必要本地生成再上传服务器。这一来一去的网络耗时就挺没有意义了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2022 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 01:05 · PVG 09:05 · LAX 18:05 · JFK 21:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.