【问题标题】:Why would php://input truncate?为什么 php://input 会截断?
【发布时间】:2013-08-29 01:21:44
【问题描述】:

我的代码中有$input = fopen( 'php://input', 'r' ); 行用于上传。

文件上传完成后,我检查$_SERVER['CONTENT_LENGTH'] 以查看所有内容均按预期发送。最近CONTENT_LENGTH和我上传文件的大小开始随机不匹配(大约每20分钟一次,人们上传非常频繁)。

我记录并保存了不匹配的内容,发现有些文件无法打开,而有些文件已下载并被切断。我在 Photoshop 中打开的一个甚至警告说文档已损坏。

我应该寻找任何可能已更改的服务器配置吗?

我尝试通过关闭浏览器选项卡和类似的东西来进行复制,但仍然无法复制错误。

我们正在通过 AJAX POST 上传。 POST 正文是上传源。

【问题讨论】:

  • 上传是一件喜怒无常的事情,你是如何保存文件的?将它们写入数据库?或将文件存储在文件夹中并引用数据库中的路径/
  • 坏副本存储在一个文件夹中,我记录位置并检查它们
  • 如果不了解实际向您的服务器发出 POST 请求的代码,这将无法弄清楚。数据是如何发送的? Flash、Javascript、HTML 表单等...?我以前遇到过这样的问题,但是在构建块并将其发送到 STDIN 时通常是数学错误。
  • 这是通过 AJAX 帖子完成的
  • 文件有多大?

标签: php upload


【解决方案1】:

在 php.ini 中有一个 post_max_size 和一个 upload_max_filesize 指令,将值与截断文件的大小进行比较,看看是否是这个原因。

【讨论】:

  • 如果是这样的话就不会那么远了,我可以轻松上传 50MB 的文件,但有时会在小于 1 兆的文件上失败。
【解决方案2】:

这听起来像是负载/网络问题。要么存在延迟问题/超时问题,即用户尝试上传而您的服务器没有响应。

通常这不是 AJAX 的责任,而是服务器(甚至可能不是 PHP)。我认为到达服务器的数据包在某些地方有丢包。它可以是数据中心的限制(例如带宽上限)或服务器本身的限制。

我们使用以下配置优化我们的服务器。这应该适用于任何 linux 发行版:

编辑/etc/sysctl.conf 文件。最后添加以下几行:

net.ipv4.tcp_wmem= 10240 87380 12582912
net.ipv4.tcp_rmem= 10240 87380 12582912
net.core.rmem_max=12582912
net.core.wmem_max=12582912
net.ipv4.tcp_max_syn_backlog=100000

您可以使用 IBM 提供的以下手册来更好地了解如何调整您的 linux: http://www.redbooks.ibm.com/redpapers/pdfs/redp4285.pdf

还有,

我会记录客户端的浏览器版本。可能是发送到您的服务器的格式取决于 AJAX,从一个浏览器到另一个浏览器是不同的。由于您没有指定 AJAX 代码,因此很难假设 AJAX 会做什么来上传文件。

【讨论】:

  • 谢谢!明天在办公室,这样我就可以更好地检查这些配置设置的含义。问题出在所有浏览器中。我怀疑它是 AJAX,因为它多年来完美无瑕。我们对服务器进行了更改,但不会影响上传……它们是一整套不同的服务器,而不是出现问题的服务器。这很奇怪,我怀疑时机是否巧合。
  • 抱歉没有回来!回应是它可能会解决这个问题,或者它可能会解决这个问题并破坏我们的网站,所以我们的开发人员担心做出这样的改变。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-07
  • 2021-08-19
相关资源
最近更新 更多