php应用程序中的关键代码部分?

php应用程序中的关键代码部分?,php,api,rest,file-upload,Php,Api,Rest,File Upload,好吧,在我看来这有点复杂,我希望我能解释清楚。如果有什么不清楚的地方,请评论,这样我就可以完善这个问题 我想处理用户文件上传到第三台服务器 所以我们有 用户 网站(运行网站的服务器) 存储服务器(接收文件的服务器) 流程应该如下所示: 该网站从storage clouds网关请求上传url,该url直接指向最终的存储服务器(类似于)。与请求一起发送“目标路径”(特定于网站且全局唯一)和重定向url 网站以存储服务器上载url为目标生成上载表单,用户选择一个文件并单击提交按钮。存储服务器处理p

好吧,在我看来这有点复杂,我希望我能解释清楚。如果有什么不清楚的地方,请评论,这样我就可以完善这个问题

我想处理用户文件上传到第三台服务器

所以我们有

  • 用户
  • 网站(运行网站的服务器)
  • 存储服务器(接收文件的服务器)
流程应该如下所示:

  • 该网站从storage clouds网关请求上传url,该url直接指向最终的存储服务器(类似于)。与请求一起发送“目标路径”(特定于网站且全局唯一)和重定向url

  • 网站以存储服务器上载url为目标生成上载表单,用户选择一个文件并单击提交按钮。存储服务器处理post请求,将文件保存到临时位置(即
    '/tmp directory/'.sha1(上面的目标路径)
    ),并将文件重定向回网站指定的重定向url。“目标路径”也被传递

  • 我不希望任何“重影文件”保留,如果用户取消进程或连接中断或什么!此外,必须避免网站数据库中的条目在存储云中未正确处理,然后被破坏。这就是原因,也是下一步

  • 这些是关键步骤

    • 网站现在将en条目写入自己的数据库,并向存储api发出restful请求(已签名,网站必须使用秘密令牌进行身份验证),该存储api
    • 将文件从其在存储服务器上的临时位置复制到其最终位置(这应该很快,因为它只是一个重命名)
    • 同一rest请求还将在存储网络数据库中插入一个数据库行,并将网站id作为所有者
  • 存储服务器上tmp目录中早于24小时的所有文件将自动删除

  • 如果用户关闭浏览器窗口或连接中断,服务器上的程序流也会中止,对吗? 只执行析构函数和已注册的关机功能,对吗

    我是否可以将此代码部分设置为“关键”代码部分,以便服务器一旦进入此代码部分,无论用户是否中止页面加载,都会将其执行到底

    (当然,我知道服务器崩溃或错误随时可能中断,但我现在担心的是正常的流程)

    其中一个是在网站数据库中有一个标志和时间戳,将文件标记为“已完成”,并在cronjob中签入旧的未完成文件,然后从存储云中删除它们,然后从网站数据库中删除它们,但我真的希望避免这个额外的字段和过程

    我希望存储api非常通用,并在未来的许多其他项目中使用它

    我看了一下Google storage for developers和Amazon s3

    他们有同样的问题,甚至更糟。在AmazonS3中,您可以“签署”post请求。因此,该文件由用户在您的权限下上传,并直接保存和存储,您必须支付。 如果连接中断,用户再也回不到你的网站,你甚至都不知道。 因此,您必须存储您签名的所有上传URL,并在cronjob中检查它们,删除所有未“到达其目的地”的内容


    对于这个问题有什么想法或最佳实践吗

    我不确定我是否会把这称为“最佳实践”,但对解决此类问题的一般方法有一些想法。当然,其中之一是允许以异步方式向存储服务器发送REST请求事务,可以通过监听传入请求的守护进程(可以通过监视文件的更改,也可以通过套接字、共享内存、数据库,以及您认为对环境中的IPC最有利的任何方式)执行或者是一个非常频繁地运行的cron作业,它将拾取并传递文件。这样做的好处是,您可以向上载文件的用户发送一条快速消息,而后台进程可以尝试,如果REST服务存在连接问题,请重试。您甚至可以进行一些AJAX轮询,以便用户在完成REST过程时可以看到一条漂亮的JS消息。

    如果我没有看错,您正在执行脚本中的关键操作,该脚本在存储服务将用户重定向回您的网站时调用

    我认为有两种方法可以确保关键步骤的完整执行:

  • 确保PHP忽略连接状态,并使用运行脚本直到完成
  • 触发一些后端进程,该进程与面向用户的脚本分开执行关键操作。如果您使用的是*NIX服务器(详细信息请参见),这可以简单到将作业放入
    at
    队列,也可以复杂到有一个专用的队列管理守护程序,就像LrdCasimir建议的那样
  • 我所面临的这些问题都有相当耗时的操作流程,因此我一直使用选项2来提供对浏览器的快速响应,并释放web服务器。选项1易于实施,但选项2最终更具容错性,因为更新将一直保留在队列中,直到可以成功地与存储服务器通信为止

    PHP手册中的页面提供了很多关于HTTP连接过程中发生的事情的深入见解