我在Apache 2.2 / PHP 5.3和Apache 2.4 / PHP 5.4上看到了以下问题
我遇到了一个罕见的问题,POST请求(小于1k)到Web服务器似乎在到达PHP服务之前将被截断,PHP服务将作用于数据。 我自己还没有能够重现这个问题,所以我只是在从日志收集的证据上工作。 在每种情况下,我收到一个有效的非零内容长度头,但没有正文的请求。
我已经倾倒了关于呼叫代理的各种信息,我没有看到任何模式。 破碎的请求来自各种浏览器和源代码ips,对于任何给定的IP,我偶尔会看到很多有效的请求。
我试过使用pecl_http的getRequestBody()和file_get_contents(“php://input”),在这种情况下也不返回任何数据。
我也暂时启用了mod_dumpio,并且在违规交易的情况下,我看到一个条目试图缓冲请求主体:
mod_dumpio: dumpio_in [readbytes-blocking] 288 readbytes
通常会跟随数据的实际缓冲,如:
mod_dumpio: dumpio_in (data-HEAP): 288 bytes mod_dumpio: dumpio_in (data-HEAP): (the post data)
但是在遇到问题的情况下,我没有看到这些条目,在这个apache进程上有几秒钟的延迟,然后我看到几个更多的实例:
mod_dumpio: dumpio_in [readbytes-blocking] 288 readbytes mod_dumpio: dumpio_in - 70014
混淆了这些重复的读取尝试,我看到一个PHP线程在格式错误的请求上执行并产生响应的证据。
从HTTP协议4.4看来,请求的主体必须与内容长度匹配,以使请求有效,所以我正在努力了解有问题的请求是如何将它提交给PHP的。
我还应该提到,这种情况下的内容types是作为application / x-www-form-urlencoded提供的,即使发送的数据是原始的json。 由于我直接从数据stream中读取数据,所以我不指望它与我的问题有关,但是值得一提。
我不想盲目地比较PHP中的内容长度和strlen($ content),但是我没有办法select如何进一步诊断问题了。 任何有关如何解决这种情况的帮助或收集更多有价值的debugging信息将不胜感激。