Apache+PHP截断后/上传


Apache+PHP Truncated Post/Upload

我一直在追踪一个影响图像上传到我们开发平台上的网站的错误(还没能在live中实现)。

简介是:

大于~20KB的POST内容被不一致地截断。

我还没能弄清楚具体发生在什么时候。我确信这些数据都传输到了Apache,但我不确定它是否接收到了所有数据,是否有一些数据没有传递到PHP,或者是否发生了其他事情。

到目前为止我采取的步骤:

  • 检查php.ini file_uploadspost_max_sizeupload_max_filesizemax_file_uploads和co是否设置为合理值
  • 在Apache配置中LimitRequestBody设置为0

我看到的确切行为有些令人困惑。作为调试的一部分,我检查了

echo strlen( file_get_contents( 'php://input' ) );

该值随每次尝试而更改,与使用的文件无关。我看到的最大值大约是500KB,最小值大约是20KB。

我已经能够在一个案例中解决这个问题(10次尝试的成功率为100%),通过使用仅在HTTP/1.0(而不是HTTP/1.1)中运行的客户端

以此为线索,我尝试使用force-downgrade-1.0和相关指令,但这些指令会影响响应而不是请求。

原因:

apache.conf有指令

Timeout 0

这导致ApacheHTTPD等待发布数据的时间为0秒,而不是像我预期的那样无限期。在开发环境中将Timeout设置为大量秒数解决了这个问题。

http://httpd.apache.org/docs/2.2/mod/core.html#timeout没有指定Timeout 0的语义,所以我认为它是从字面上解释的。