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

Java1.7.0_09上でColdFusion9.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

これは、上記のPeterの/あなた自身のコメントに基づいています。

配列と構造体の省略形の概念には多くのバグがあり、CF8が構文を導入してから続いています。アドビの修正へのアプローチは、問題を一度適切に解決するための努力というよりは、モグラたたきに少し似ています。この別の例を見つけたようです。これがCF10にまだ存在するかどうかを確認するのは興味深いことですが、開発サイクル中にさらに修正されたことがわかっています。

それを回避する唯一の方法は、これらの問題が発生する状況でその表記を使用しないことです。

アドビがそれを認識できるように、plsはこれについてバグを提起できますか?

また、少し注目に値しますが、ここでの特定の問題とは関係ありません。CFはJava1.7ではまだサポートされていません。あなたはそれを心に留めたいかもしれません。

于 2012-10-24T20:24:04.773 に答える
0

タグの周りにロックを追加して、ファイルの変更が1つのリクエストのみに許可されるようにすることを検討してください。

于 2012-10-24T18:53:35.027 に答える
0

最初の例では、ブール値ではなく配列としてtmpを宣言した場合、違いはありますか?

<cfset var tmp = ArrayNew(1) />

それ以外の...

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