我在 Apache 2.2/PHP 5.3 和 Apache 2.4/PHP 5.4 上看到了以下问题
我遇到了一个罕见的问题,即对 Web 服务器的 POST 请求(小的,小于 1k)似乎在到达将对数据进行操作的 PHP 服务之前被截断。我自己无法重现这个问题,所以我只能根据从日志中收集的证据进行工作。在每种情况下,我都会收到一个带有有效非零 Content-length 标头但没有正文的请求。
我收集了有关调用代理的各种信息,但没有发现任何规律。损坏的请求来自各种浏览器和源 IP,对于任何给定 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 的。
我还应该提到,在这种情况下,内容类型被提供为 application/x-www-form-urlencoded,即使发送的数据是原始 json。由于我直接从流中读取数据,因此我不认为这与我的问题有关,但值得一提。
我不想盲目地将 PHP 中的 content-length 与 strlen($content) 进行比较,但我没有其他选择来进一步诊断问题。如果您能提供任何帮助来修复这种情况或收集更多有价值的调试信息,我将不胜感激。