我正在将一个组件放置在我的应用程序范围内,以便它可以在所有请求之间共享,并且它包含一个cfm模板:
<cfcomponent output="false">
<cffunction name="run" output="false" returntype="void">
<cfset var tmp = false/>
<cftry>
<cfinclude template="inc.cfm"/>
<cfcatch>
<cffile action="append"
file="#ExpandPath("error.log")#"
output="ERROR: #cfcatch.message#"/>
</cfcatch>
</cftry>
</cffunction>
</cfcomponent>
被包含的模板仅仅创建了一个数组并检查数组长度是否符合要求,如果不符合,则会写入到
error.log
文件中。<cfset tmp = [
"one",
"two",
"three"
]/>
<cfif ArrayLen(tmp) neq 3>
<cffile action="append"
file="#ExpandPath("error.log")#"
output="Length = #ArrayLen(tmp)#"/>
</cfif>
如果我在它上面运行负载(100个并发线程),那么以下内容会出现在我的error.log
文件中...
ERROR: element at position 3 of array variable "___IMPLICITARRYSTRUCTVAR0" cannot be found.
Length = 0
Length = 2
注意 我在Java 1.7.0_09上使用ColdFusion 9.0.1.274733。我已经在相同的JRE上测试了Railo,并且它可以正常工作。
附加信息 下面的内容也会导致问题,将tmp
变量更改为结构体并添加一个随机项到variables
范围中,但该项未被引用...
<cfcomponent output="false">
<!---
Some random variable that does nothing with the exception
of being the facilitator of my eternal pain
--->
<cfset variables.t = {}/>
<cffunction name="run" output="false" returntype="void">
<cfset var tmp = {}/>
<cftry>
<cfinclude template="inc2.cfm"/>
<cfcatch>
<cffile action="append"
file="#ExpandPath("error.log")#"
output="ERROR: #cfcatch.message#"/>
</cfcatch>
</cftry>
</cffunction>
</cfcomponent>
这包括一个模板,与第一个非常相似,长这样...
<cfset tmp.arr = [
"one",
"two",
"three"
]/>
<cfif ArrayLen(tmp.arr) neq 3>
<cffile action="append"
file="#ExpandPath("error.log")#"
output="Length = #ArrayLen(tmp.arr)#"/>
</cfif>
如果您从
variables
范围中删除该项,则它可以正常工作。如果在模板中转储#variables#
和#local#
,则所有内容都应该在您期望的位置。
(来自评论的更新)
我已经将此问题提升为bug#3352462
ArrayNew(1)
并逐个设置每个项目似乎可以按预期工作。 - Stuart Wakefield