为什么具有无限循环的请求不会被ColdFusion请求超时杀死?

Hen*_*nry 6 coldfusion infinite-loop

首先,我将(秒)之后的超时请求设置为20CF Admin.

然后我运行一个像一条线的cfm while(true);

页面将运行超过20秒,并且在我写这篇文章时线程仍然存在.

以下是使用Server Monitor拍摄的快照

Thread  jrpp-3 request type - TEMPLATE REQUEST
*Template Path - D:\Projects\infiniteLoop.cfm
*Request Parameters - {}
*Request Method - GET
*Client IP address - 127.0.0.1
*Thread elapsed time - 322659 milliseconds
Run Code Online (Sandbox Code Playgroud)

这是正常的?? 这是CF9.0.1.,开发人员版.使用JRun进行多实例设置.

停止无限循环的唯一方法是重启CF.

bar*_*nyr 12

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>
Run Code Online (Sandbox Code Playgroud)

上面的代码显示了requesttimeout的一些奇怪行为.正如Mark Kruger所指出的那样,对外部资源的任何调用都意味着不会检查超时,而我的猜测也是不会检查刚刚执行您自己的逻辑的大块脚本,而是留下下一个输出语句.

如果你需要跟踪代码滞后的地方并且超时消息指向错误的位置,我将使用logging或jstack从长时间运行的代码运行时从服务器获取堆栈跟踪.在几秒钟内抓取几个堆栈跟踪,然后通过Samurai运行日志文件以查找代码正在执行的操作.