在过去的几个月里,我遇到了一个奇怪的间歇性问题,我一直在疯狂地尝试隔离。
我有一个 Flash 电影在我的网站上运行,它生成 XML 数据,然后通过 POST 请求将其发送到 PHP 脚本。此文件的完整性是我的应用程序正常运行的关键,因此我需要确保它完好无损地到达。为此,我生成了一个 MD5 哈希并将其也一起发送。在接收方,我的 PHP 脚本将接受数据,对其进行 MD5 处理并比较两个哈希值。如果它们相同,那么我认为该文件没有问题并将其存储起来以备后用。如果 MD5 哈希值不同,我会向自己发送一封电子邮件并制作一份文件副本以供人工检查。
大多数情况下 (>99%) 这都能很好地工作,而且我发现上传的数据没有问题。然而,每隔一段时间我就会发现一些额外的字符被注入(inject)到 XML 文件中,导致它被破坏。发生这种情况时,文件似乎也被截断了。这是我在损坏的文件中看到的片段 - 它看起来好像是一些与网络服务器相关的设置:
...开始 XML 数据...
<scale>1.7</scale>
<rotation>0</rotation>
<popdelay>0.7290036325342953</popdelay>
Proxy-Connection: keep-alive
Cache-Control: max-age=0
0<poptime>0.6</poptime>
<popangle>90</popangle>
<shadowvis>true</shadowvis>
<backingcolor>0xFF222222</backingcolor>
... 继续 XML 数据 ...
我发现该问题在特定机器上发生后会继续发生——也就是说,如果用户不断尝试上传他们的文件,错误将在 100% 的时间内继续出现。我在多个浏览器/平台(如下所列)上看到过这种情况:
Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.5; en-US; rv:1.9.2.10) Gecko/20100914 Firefox/3.6.10
Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; CMNTDF; InfoPath.3; .NET4.0C)
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; InfoPath.1)
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.16) Gecko/20101130 Firefox/3.5.16 (.NET CLR 3.5.30729)
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; CMNTDF; InfoPath.3; .NET4.0C)
Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.3) Gecko/20100423 Ubuntu/10.04 (lucid) Firefox/3.6.3
我的应用程序服务器正在通过另一个运行 mod_proxy 的 apache2 服务器访问,但我不确定它是否起作用,因为这个过程似乎几乎所有时间都在其他机器上工作。我试图调整我的 apache2 设置,但它们似乎没有任何区别(如果您认为相关/有用,我可以稍后发布)
如果有人知道发生了什么或如何开始解决这个问题,我将非常非常感激。几个月来我一直在努力研究这个问题,但一无所获。
非常感谢您的宝贵时间!
最佳答案
您的代理服务器似乎正在分块上传,因为客户端没有发送 Content-Length header 。 http://httpd.apache.org/docs/2.2/mod/mod_proxy.html#request-bodies
尝试打开 proxy-sendcl,这将强制代理缓冲上传以确定内容长度,并在上传到达您的服务器时停止分块。
关于php - 间歇性问题: POST requests getting corrupted,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5297749/