0

我和我的同事已经被这个问题难住了好几个星期。我们在 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 服务器上出现此问题。

4

2 回答 2

0

你使用Zend_Json还是 PHP 内置的json_encode函数进行编码?检查 php.ini 中的 PHP memory_limit 设置。

还要检查 PHP 错误报告和错误日志设置(php.ini 中的 error_reporting 和 error_log 指令)。

我猜 PHP 会输出一些东西或安静地终止脚本执行,而不是重置 HTTP 连接。

查看 Web 服务器上的日志以了解更多详细信息:

  • 事件查看器 > Windows 日志 > 应用程序 / 系统 > 查看 PHP FastCGI 工作进程是否崩溃

  • IIS 日志文件 > 确定失败 HTTP 请求的响应代码和状态

  • 使用 IIS 中的“失败请求跟踪规则”获取失败请求的更多详细信息

  • 最后,使用进程监视器 (ProcMon),过滤它以仅显示应用程序池 (w3wp.exe) 和 PHP/FastCGI 进程,以检查给定时刻的 PHP 和 IIS 活动

于 2013-01-31T00:00:00.367 回答
0

我有类似的问题,卷曲请求需要超过 10 分钟,并出现以下错误

卷曲错误:SSL 读取:错误:00000000:lib(0):func(0):reason(0),errno 10054

根本原因是默认情况下,如果请求的服务器没有响应,curl 会在 5 分钟后终止请求。我尝试使用 CURLOPT_TIMEOUT => 3600 增加执行时间,但由于某种原因 curl 忽略了此设置。

解决方案:对我有用的是在 curl 选项中设置保持活动标志以及超时标志CURLOPT_TCP_KEEPALIVE => 1

于 2021-06-02T19:11:43.463 回答