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

为什么';具有无限循环的请求是否会被ColdFusion请求超时杀死?,coldfusion,infinite-loop,Coldfusion,Infinite Loop,首先,我在CF Admin中将超时请求(秒)设置为20 然后,我运行一个cfm,其行类似于while(true) 页面将在20秒后运行,当我写这篇文章时,线程仍然处于活动状态 下面是使用服务器监视器拍摄的快照 Thread jrpp-3 request type - TEMPLATE REQUEST *Template Path - D:\Projects\infiniteLoop.cfm *Request Parameters - {} *Request Method - GET *Clie

首先,我在CF Admin中将超时请求(秒)设置为
20

然后,我运行一个cfm,其行类似于
while(true)

页面将在20秒后运行,当我写这篇文章时,线程仍然处于活动状态

下面是使用服务器监视器拍摄的快照

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
这正常吗??这是CF9.0.1,开发者版。 多实例设置,使用JRun


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

我发现了与Henry相同的事情。以下是我的测试代码:

Before thread<br />
<cfthread action="run" name="t1">
    <cfloop condition="true">
        <cfparam name="count" default="0">
        <cfset sleep(3000)>
        <cflog file="cfthreadTest" text="Log entry #++count#">
    </cfloop>
</cfthread>
After thread<br />
线程前的

线程后
在CFAdmin中,我的请求超时设置为20sec,该线程现在已经运行了15分钟。也就是说,线程不是“请求”,所以我不确定它是否会遵守请求超时。我找不到任何文件表明它应该尊重请求超时。也就是说。。。有一些杀死线程的方法是“方便的”


我想这只是一个“答案”,因为我认为您的期望是不正确的,因为您希望它尊重请求超时。

ColdFaison中的请求超时不会以您期望的方式进行。你可以想象,有一个看门狗检查你的请求运行了多长时间,并在请求超时时或请求超时后不久将其杀死。 实际发生的情况是,只有在运行某些标记时,CF才会检查请求的运行时间是否超过设置的限制
是它检查的标记之一,这就是为什么您经常看到指向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>

你好

对于(foo=1;foo当您知道ColdFusion中的请求超时检查约束时,您所描述的是令人遗憾的预期行为。(当然,这不应该是预期行为。)

查理·阿雷哈特(Charlie Arehart)就超时问题进行了长篇大论。其中一节的标题是“CF在下一次操作开始时检查时间,但遗憾的是,仅在一些标签上”。不幸的是,
cfscript
不是其中之一,并且不会使用纯脚本代码检查超时。但是,触发超时检查的标记之一是
cfoutput
,有了这些知识,就可以使基于脚本的代码尊重请求超时。不过,这是一个手动过程,您需要决定是否超时我们自己应该在哪里检查超时

<cffunction name="cf_checkRequestTimeout" access="public" output="false" returntype="void" hint="Force CF to check if the request has timed out.">

    <!--- CF checks Request timeout on cfoutput tag use.  --->
    <cfoutput></cfoutput>

</cffunction>

<cfscript>
    for(foo=1;foo<=61;foo++){
        sleep(1000);
        cf_checkRequestTimeout();
    }
</cfscript>


对于(foo=1;foohhenry…您在无限循环中做什么。有些事情会抢占全局超时(db调用、ftp、需要外部资源的事情).伙计们…这个问题没有提到CFTHREAD…不知道这是从哪里来的。@MarkAKruger我正在实现一些新的东西。代码仍然不稳定。我用CFScript写的,没想到最终被无限执行的代码不会被CF的请求超时杀死。我想Barny的答案是这样的可能是确定的。我询问了一些Adobe人员,但一致认为是的-cfscript中的循环不会响应全局超时值。如果您以标记格式重写循环,我猜您会得到预期的超时。请记住,尽管本机调用(文件I/O、DB等)仍然会受到这个问题的影响。只是对这个问题有了一个想法,CF共享托管不是很麻烦吗?巴尼-这是一个很棒的答案。我喜欢它。谢谢你的例子。看起来是一个很好的选择,可以发布博客和做进一步的调查。我想补充一下答案,只是为了推荐武士。(但总的来说,这也是一个很好的答案!)非常感谢您的调查!非常有趣/奇怪的结果。谁会想到,相同的循环,但在cfscript中,不会根据请求超时进行检查。这应该得到纠正,或者在某个地方进行记录……您是否也在使用CF 9.0.1?也许我们应该根据CF7或CF8对其进行测试,看看是否确实相同sult@barnyr您的调查让我思考……如果我以一种策略性的方式调用我的cfscript,我仍然可以获得请求超时行为。@Henry ColdFusion在“执行”之前检查请求超时标记的数量有限。
cfoutput
是这些标记之一,也是大多数超时错误报告的罪魁祸首是
cfoutput
。因此,如果您的函数中只有一个
cfoutput
,那么您只需要让CF检查请求超时是否已过期,而其他开销很少。将它放在函数中循环将使循环尊重请求超时。答案为Thx,但我不应该在标题中包含“thread”一词,因为我根本没有使用cfthread。问题已更新。好的,在这种情况下,我们不能超过@barnyr的答案。@Henry将请求超时,并弄清楚发生了什么使请求超时这是两个不同的问题。这个答案只是让超时发生。你说“哪个调用正在抛出”是指循环的哪个迭代?你需要添加更多的逻辑来解决这个问题。