【问题标题】:IIS 7 and PHP response timeout for large object大型对象的 IIS 7 和 PHP 响应超时
【发布时间】:2013-01-30 01:09:50
【问题描述】:

我和我的同事已经被这个问题难住了好几个星期。我们在 IIS 7 环境中托管了一个 PHP 5.3 Web 应用程序。应用程序从 SQL Server 2012 数据库后端获取结果集并将其作为 JSON 对象发送回客户端。

当发出的请求导致对象大小超过大约 4MB 时,就会出现问题。因此,每次响应超过此大小时,连接都会重置并导致错误。我已经使用 Curl 在本地服务器上确认了这一点,这非常有用.JQ JSON command-line parser。使用这些工具,当我在托管应用程序的 IIS Web 服务器上运行请求时,它成功完成响应 4MB 并出现 Curl(56) 错误“连接已重置” .

一些补充说明:

  • 直接针对数据库运行的查询只需大约 20 秒即可完成,因此数据库性能不是问题。

  • 我们在本地桌面开发环境中的 Apache 之上运行 Zend Framework;但这个问题在其中任何一个中都无法重现。在 Web 服务器上失败的相同 > 4MB 响应对象在向我们的本地 Apache 托管环境发出相同请求时成功完成。

我梳理了 Web 服务器的 IIS 7 配置设置并进行了以下更改

  • 我已将允许的最大内容长度和 URL 长度从默认值增加到 30MB。
  • PHP、FastCGI 和 IIS 连接超时设置分别设置为 5 分钟。我运行了一些较小的查询,最多需要一分钟才能完成,但只要小于 4MB,就会始终返回有效响应。

我开始读到 IIS 7 的响应缓冲区缓存机制也可能会影响 PHP 应用程序的性能,但我仍然对这个特性很熟悉。如果有人过去遇到过类似的问题,或者可以提供一些关于问题可能是什么的见解,我很开放。在这一点上,我不确定还有什么可能导致 IIS 7 Web 服务器上出现此问题。

【问题讨论】:

  • 不要将您问题的答案放在OP中。将答案发布为答案并将其标记为答案。

标签: php iis iis-7 windows-server-2008 fastcgi


【解决方案1】:

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

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

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-17
      • 2013-06-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多