ColdFuison 中的请求超时不符合您的预期。他们的呈现方式,你会想象有一个看门狗检查你的请求已经运行了多长时间,并在请求超时或请求超时后不久将其杀死。实际发生的情况是,只有在运行某些标签时,CF 才会检查请求的经过时间是否超过了设置的限制。<cfoutput>
是它检查的标签之一,这就是为什么您经常看到指向 cfoutput 的超时超出消息的原因,即使您知道它不会花费很长时间来执行。
<cfsetting requesttimeout="5" enableCFoutputOnly="no" />
<!--- Looping with a condition <cfloop blamed --->
<cfset request.counter=0 />
<cfloop condition="true">
<cfset sleep(1000) />
<cfset request.counter=request.counter+1>
<cflog file="timeout" text="#request.counter#">
<cfif request.counter GT 8>
<cfbreak>
</cfif>
</cfloop>
<!--- Looping with an index, times out, naming CFLOOP as the offending tag --->
<cfloop index="foo" from="1" to="8">
<cfset sleep(1000) />
</cfloop>
<!--- Looping with an index, times out, naming CFOUTPUT as the offending tag --->
<cfloop index="foo" from="1" to="8">
<cfset sleep(1000) />
<cfoutput>Hello</cfoutput>
</cfloop>
<!--- Same loop, but in script. No timeout warning at all --->
<cfscript>
for(foo=1;foo<=8;foo++){
sleep(1000);
}
</cfscript>
<!--- Same loop, now with WriteOutput() called. Still no timeout --->
<cfscript>
for(foo=1;foo<=8;foo++){
sleep(1000);
writeoutput("tick...");
}
</cfscript>
上面的代码显示了 requesttimeout 的一些奇怪行为。正如 Mark Kruger 指出的那样,任何对外部资源的调用都意味着不检查超时,我猜只是执行您自己的逻辑的大块脚本也不会被检查,而下一个输出语句将受到指责。
如果您需要跟踪代码滞后的位置并且超时消息指向错误的位置,我会在长时间运行的代码运行时使用日志记录或 jstack 从服务器获取堆栈跟踪。每隔几秒钟抓取一些堆栈跟踪,然后通过Samurai运行日志文件以查找代码在做什么。