【问题标题】:Receiving as much of an HTTP request as possible that didn't complete尽可能多地接收未完成的 HTTP 请求
【发布时间】:2015-07-06 16:51:38
【问题描述】:

简而言之,如果我发送的 HTTP POST 带有较大的 (20-30mb) 有效负载,并且在向服务器发送请求的过程中连接中断,我可以恢复在连接断开之前发送的 10mb+ 吗?

在我在 NGINX 上测试 PHP 时,如果在上传过程中连接断开,我的 PHP 似乎永远不会启动。我在脚本的顶部有 ignore_user_abort(1),但这似乎只有在收到完整的请求后才相关。

是否有某个配置设置可以让我看到收到的所有请求,即使它没有收到完整的请求?

我主要通过间歇性连接发送这些文件,所以我想尽可能多地发送每个请求,然后询问服务器从哪里继续。就目前的情况而言,我必须将文件分段发送,如果有错误则减小片段的大小,或者如果一段时间内没有任何错误则增加大小。这非常缓慢且浪费带宽。

=======

我应该澄清一下,我所追求的不仅仅是一次上传一个大文件,就像连接中断一样,我可以从我离开的地方继续吗?在我所有的测试中,如果没有收到完整的帖子,整个请求就是垃圾,PHP没有通知,所以我必须从头开始。

我必须运行一些测试,但你是说如果我对请求使用分块传输编码,PHP 会在断开连接之前获得所有接收到的块吗?值得一试,当然最好是在连接中断的情况下发布多个较小的帖子。

感谢您的建议。

【问题讨论】:

  • Upload very large files(>5GB) 的可能重复项
  • 许多分块库会处理此类情况,因此您不必这样做。我强烈推荐使用一个,因为它允许更大的文件以及可恢复的上传。

标签: php nginx upload


【解决方案1】:

永远不要通过脚本后端(Ruby、PHP)处理大文件上传,有一个内置的直接上传功能称为client_body_in_file_only,请在此处查看我对此的非常深入的概述:https://coderwall.com/p/swgfvw/nginx-direct-file-upload-without-passing-them-through-backend p>

唯一的限制是它不适用于多部分表单数据,只能通过 AJAX 或从移动设备或服务器直接 POST 到服务器。

【讨论】:

  • 很高兴知道它存在,但不幸的是目前对我没有帮助。在我的测试中,我开始传输一个大文件,给它时间开始,然后切断连接。上传/临时文件夹中没有文件。当我没有断开连接时,文件上传正常(除了我的自定义标头似乎只有一个通过,但这可能是我的一个简单错误)。
  • 该文件基本上是您在磁盘上转储的 HTTP 请求的主体。请求完成或中断导致“问题”,但这是预期的行为。尝试丢弃请求,但我不确定它是否有帮助。
  • 从那以后我能够做的调查在能够阅读我最初的问题的部分上传方面尚无定论,但我已将此项目标记为答案,因为它有助于很多事情向前发展,如果我想一次性发送非常大的文件,这肯定是要走的路。非常感谢@mikhailov。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-30
  • 1970-01-01
  • 2019-09-09
  • 2019-05-19
相关资源
最近更新 更多