6

我在我的应用程序范围中放置了一个组件,以便它在所有请求之间共享,并且它包括一个 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 &quot;___IMPLICITARRYSTRUCTVAR0&quot; 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#在模板中,一切都在您期望的位置。


(评论更新)

我已经将此问题作为错误 #3352462 提出

4

3 回答 3

4

这是基于彼得/您自己的上述评论。

从 CF8 引入语法以来,数组和结构简写概念已经存在 / 存在许多错误。Adobe 修复它们的方法有点像打地鼠,而不是一次正确地解决问题。看起来你已经找到了另一个例子。不过,看看这是否仍然存在于 CF10 中会很有趣,因为我知道他们在其开发周期中修复了更多问题。

解决它的唯一方法是在您看到这些问题的情况下不使用该符号。

您能否为此提出一个错误,以便 Adob​​e 意识到这一点?

还有一点值得注意,但与您在此处的具体问题无关:Java 1.7 尚不支持 CF。你可能想记住这一点。

于 2012-10-24T20:24:04.773 回答
0

您可能会考虑在您的标签周围添加一些锁定,以确保只允许一个请求来修改文件。

于 2012-10-24T18:53:35.027 回答
0

在您的第一个示例中,如果您将 tmp 声明为数组而不是布尔值,是否有任何区别?

<cfset var tmp = ArrayNew(1) />

代替...

<cfset var tmp = false />
于 2012-10-24T19:17:23.987 回答