我一直在追踪一个影响图像上传到我们开发平台上的网站的错误(还没能在live中实现)。
简介是:
大于~20KB的POST内容被不一致地截断。
我还没能弄清楚具体发生在什么时候。我确信这些数据都传输到了Apache,但我不确定它是否接收到了所有数据,是否有一些数据没有传递到PHP,或者是否发生了其他事情。
到目前为止我采取的步骤:
- 检查php.ini
file_uploads
、post_max_size
、upload_max_filesize
、max_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
的语义,所以我认为它是从字面上解释的。