我和我的同事已经被这个问题难住了好几个星期。我们在 IIS 7 环境中托管了一个 PHP 5.3 Web 应用程序。应用程序从 SQL Server 2012 数据库后端获取结果集并将其作为 JSON 对象发送回客户端。
当发出的请求导致对象大小超过约 4MB 时,就会出现问题。因此,每次响应超过此大小时,连接都会重置并导致错误。我已经通过使用 Curl 和这个非常有用的 .JQ JSON command-line parser在本地服务器上确认了这一点。使用这些工具,当我在托管应用程序的 IIS Web 服务器上运行请求时,它成功完成响应 < 4MB,但无法完成响应 > 4MB 并出现 Curl(56) 错误"Connection was reset"。
一些附加说明:
直接针对数据库运行的查询只需大约 20 秒即可完成,因此数据库性能不是问题。
我们在本地桌面开发环境中的 Apache 之上运行 Zend Framework;但这个问题在其中任何一个中都无法重现。在 Web 服务器上失败的相同 > 4MB 响应对象在向我们的本地 Apache 托管环境发出相同请求时成功完成。
我梳理了 Web 服务器的 IIS 7 配置设置并进行了以下更改
- 我已将允许的最大内容长度和 URL 长度从默认值增加到 30MB。
- PHP、FastCGI 和 IIS 连接超时设置分别设置为 5 分钟。我已经运行了最多需要一分钟才能完成的较小查询,但只要它小于 4MB,就会始终返回有效响应。
我开始读到 IIS 7 的响应缓冲区缓存机制也可能会影响 PHP 应用程序的性能,但我仍然对这个特性很熟悉。如果有人过去遇到过类似的问题,或者可以提供一些关于问题可能是什么的见解,我是开放的。在这一点上,我不确定还有什么可能导致 IIS 7 Web 服务器上出现此问题。