0

使用 Dropzone.js 和 Dropbox API,我希望设置一个可以接受高达 10G 文件的拖放式 Web 界面。它适用于高达 ~50M 的文件,但在此之后失败并出现 413 Request Entity Too Large 错误。我一直在尝试的示例文件是 1.5G。我已经尝试了我所知道的更改大文件上传的方法,但似乎仍然无法正常工作。我希望有人可以通过查看我的 PHP 设置来指出我正确的方向。

这是相关的渲染phpinfo(): http: //codepen.io/jboneca/pen/bNvEwV

附加信息:

  • 我们的服务器上从未存储任何文件。它被直接上传(在大多数情况下是成功的)到 Dropbox。
  • Dropzone 已禁用文件大小限制。
  • 以下设置已更改,无济于事。upload_max_filesize, post_max_size, max_execution_time, max_input_time, memory_limit. 也许它们还需要更大?
4

1 回答 1

2

需要注意的几点:

  1. 当您使用 php 处理文件上传时,即使您的脚本最终没有保存文件而只是将其发送到 Dropbox API——它的工作方式是 php 必须将其写入服务器上的临时位置,例如 / tmp/临时文件名。因此,您的服务器必须有足够的空间来存储文件,即使它只是临时的。然后,您的脚本通过 Dropbox API 上传文件,PHP 将自动从临时位置清理/删除文件。
  2. 当 post_max_size 不足以处理您的请求时,通常会发生 413 Request Entity Too Large 错误,但在您的情况下,您可能还会遇到其他限制它的问题。
  3. 根据我运行处理大量数据的命令行 php 脚本的经验,php 内存限制开始突破 1700M-2000M 左右。这意味着,即使将 memory_limit 设置为更高的值,php 本身也无法处理那么大的内存限制检查,并且当内存使用量超过 1800M 左右时会失败。(也许它使用带符号的 32 位 int 来限制内存?不确定。)
  4. 我也使用过 Dropzone.js + php 文件上传的组合,并且上传数百 MB 的文件没有问题。我建议你试试这个:将upload_max_filesize设置为1100M,将post_max_size设置为1200M,并将memory_limit设置为1700M。现在,首先尝试 100mb 的文件,然后是 500mb,然后是 1gb。我相信它适用于所有这些尺寸。现在将每个设置调高,看看你可以接近 1.5gb。这可能是您拥有的当前 php 版本和服务器的限制。
  5. 仅供参考,如果您的错误是 413 Request Entity Too Large,那么 max_execution_time 不是您的问题。(你甚至还没有)这只是执行 php 脚本中所有行所需的时间。(如果您将文件保存在本地服务器上,即使您上传 1GB 文件,此时间也会以毫秒为单位。)但是,由于您需要将此文件从服务器发送到 Dropbox API,因此您的请求可能需要太长并且超过了 max_execution_time 限制。我相信您在解决当前上传问题后会遇到问题。为了解决这个问题,我建议你的 http 请求处理 php 脚本简单地将文件添加到某个队列中,并有一个单独的消费者进程从队列中读取并将文件上传到 Dropbox。(也可能为您的用户提供更好的用户体验,因此他们不会
于 2015-02-18T23:21:46.270 回答