我的同事和我在这个问题上被困了几个星期。我们在IIS 7环境中托管了一个PHP 5.3 Web应用程序。应用程序从SQL Server 2012数据库后端获取结果集,并将其作为JSON对象发送回客户端。
当发出导致对象大小超过大约4MB的请求时,问题就出现了。因此,每次响应超过此大小时,连接都会重置并导致错误。我已经使用Curl在本地服务器上确认了这一点,这非常有用.JQ JSON command-line parser。使用这些工具,当我在托管应用程序的IIS Web服务器上运行请求时,它会完成响应< 4MB成功,但未能完成响应> 4MB卷曲(56)错误“连接已重置”。
一些补充说明:
直接针对数据库运行的查询只需要大约20秒即可完成,因此DB性能不是问题。
我们在本地桌面开发环境中在Apache上运行Zend Framework;但是这个问题在任何一个问题上都是不可复制的。相同的>在Web服务器上失败的4MB响应对象,在向本地Apache托管环境发出相同请求时成功完成。
我梳理了Web服务器的IIS 7配置设置并进行了以下更改
我开始读到IIS 7的响应缓冲区缓存机制也可能会影响PHP应用程序性能,但我仍然熟悉这个功能。如果有人过去遇到类似的问题,或者可以提供一些有关问题的见解,我就是开放的。此时我不确定IIS 7 Web服务器上还有什么可能导致此问题。
答案 0 :(得分: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中的“失败的请求跟踪规则”获取失败请求的更多详细信息
最后,使用Process Monitor(ProcMon),过滤它以仅显示应用程序池(w3wp.exe)和PHP / FastCGI进程以检查给定时刻的PHP和IIS活动
< / LI>答案 1 :(得分:0)
我遇到了类似的问题,curl 请求耗时超过 10 分钟,并出现以下错误
卷曲错误:SSL 读取:错误:00000000:lib(0):func(0):reason(0), errno 10054
根本原因是默认情况下,如果请求的服务器没有响应,curl 会在 5 分钟后终止请求。我尝试使用 CURLOPT_TIMEOUT => 3600 来增加执行时间,但由于某种原因 curl 忽略了此设置。
解决办法: 对我有用的是在 curl 选项中设置 keep alive 标志以及超时标志 CURLOPT_TCP_KEEPALIVE => 1。