cflocation不再适用于CF10
自从我从CF9升级到CF10后,我一直在与cflocation进行对抗。 我已经做了很多次,但总是放弃,但今天终于让我很烦恼,现在是时候解决问题了(我希望)。
首先,道歉,因为我试图编写一个简单的测试用例来重现这个问题,但到目前为止,我一直无法在原始代码之外重现它。
我有一个应该在一夜之间运行的多步骤导入过程。 该过程由大约10个链接在一起的文件组成。 通过计划任务调用进程时,还会传递一个URL参数(scheduledtask)。 如果该参数不存在,则在每个步骤结束时停止并等待用户点击指向下一步的链接。 如果参数确实存在,则使用cflocation移动到下一步。
在所有步骤中,第二个步骤是最复杂和最耗时的(来自多个Web服务请求的数据,然后需要加入,清理并插入到数据库中)。 这是移至CF10后出现问题的第二步。 该页面似乎正常工作,因为它正在到达cflocation标记所在页面的最底部,但它从不触发cflocation。 我添加了一个cfmail标签给我发电子邮件,因为cflocation被调用,它总是被发送,但是cflocation不会触发。
它不能比以下更基本:
<cfif scheduledtask EQ "true">
<cfmail from="xxxxx” to="xxxx” subject="About to call duplicate" type="text/html">
<p>calling duplicate check - scheduledtask</p>
</cfmail>
<cflocation url="importDupCheck.cfm?scheduledtask=true" addtoken="false">
</cfif>
我知道cfflush和cflocation存在问题,我已经检查过。
作为一个测试,我试着将上面的逻辑向上移动到网页服务之后的所有数据中,但在处理之前,这一次cflocation工作。 我想也许这是一个超时问题,即使页面被允许完全加载,计划任务引擎已经放弃了等待。 我试着通过一个基本文件来测试它:
<cfset sleep(240000)>
* 4 minutes
之前称为cflocation但它工作正常。
该过程中的其他步骤按照预期与cflocation一起工作,而不是这个。 所有这些代码在CF9下运行良好,只是在CF10上失败。
有人在我应该看的地方有一些指示吗?
问候马克
*更新*所以我现在已经制定了如何在几行代码中轻松地重现这一点。 原来它与计划任务无关。
index.cfm
<h1>Testing cflocation</h1>
<cfloop index="i" from="1" to="7000" ><!--- For me it stops working once the loop goes beyond 6808 rows --->
row <cfoutput>#i#</cfoutput>: abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789<br/>
</cfloop>
<p>Now loading resultpage via cflocation</p>
<cflocation url="resultpage.cfm" addtoken="false">
resultpage.cfm
<h1>Made it!</h1>
<p>Reload the <a href="index.cfm">first page</a></p>
在我的测试中,我发现如果我循环6808次,但6809次失败。 有了7000条记录,我们只是在谈论一个36 KB的文件......为什么这只会在CF10中失败呢?
最后要注意的一点是,如果它有影响,我所做的一切都是通过https完成的。
好吧,我已经完成了
在CF管理员
最大输出缓冲区大小1024
之后会发生刷新,这将停止cflocation工作。
增加它,它的作品。
恐怕,我不知道为什么你的代码不起作用。 据猜测,这归结于ColdFusion 10对计划任务引擎的更换,而且它不喜欢一些虚无of client的客户端重定向。
不过也许你可以绕过这种情况。
ColdFusion 10的调度程序有一个链接任务的概念,所以当一个任务完成时,另一个任务将被启动。 您可以设想修改您的调度程序来改变它?
我有一个类似的问题,但我在cfscript中使用了location()函数。 但我怀疑同样的原则适用。
在location()函数之前,我们调用了一个未包含在<cfsilent>
标签中的函数。 因此,函数的每一行(包括循环)都将作为HTML的空行输出。 当我查看源代码时,有超过20,000行的空HTML代码。 这可能足以达到1024 kb的缓冲区限制,并触发中止重定向的刷新。
通过向自定义函数添加<cfsilent>
标记,我将HTML空行数减少为39,现在location()函数按预期工作。
要确定这是否是您遇到的问题,请添加终止; (或<cfabort>
)位于location()之前,然后查看结果的源代码 - 大概是空页面。